当前位置: 首页 > 知识库问答 >
问题:

有理数的哈希码

利俊迈
2023-03-14

我用java实现了一个类来模拟有理数,它有两个整数来模拟分子和分母。我需要覆盖Object的hashcode方法,所以相同的数字有相同的hash代码。

我已经这样定义了equals()方法:

public boolean equals(Object obj) {
    Racional r = null;
    if (obj instanceof Racional) {
        r = (Racional) obj;
    } else {
        return false;
    }
    return r.getDenominador() * this.numerador == r.getNumerador() * this.denominador;
}

关于此:

返回分子*分母是个好方法吗?

等价的有理数(如1/4和2/8)是否应该返回相同的哈希码?

共有3个答案

季嘉良
2023-03-14

建议类似这样的内容:

37*numerator + 13* denominator

对于哈希码,其中这些是素数。

我认为1/4和2/8是不同的,除非你有一个积极的正常化政策。但这取决于你。确保您很好地记录了这些行为。

更新:您需要决定平等的含义。我会先规范化,然后写:

return this.numerator == r.numerator && this.denominator == r.denominator
吕皓
2023-03-14

等价的有理数(比如1/4和2/8)应该返回相同的hashcode吗?

由于您的equals()方法返回1/4和2/8的true,因此这两个数字必须具有相同的哈希码。

实现这一目标的一种方法是简化分数(例如,在施工时)。这可以通过将分子和分母除以它们的 GCD 来完成。一旦你这样做了,任何合理的hashCode()函数都可以完成这项工作。

景英杰
2023-03-14

这完全取决于您如何实现< code>equals方法。如果< code>obj1.equals(obj2)为< code>true,则< code > obj 1 . hashcode()= = obj 2 . hashcode()也应该为< code>true。我可能会使用< code>new Double((double)分子/分母)。hashCode(),但是您的需求可能不允许这样做。

/edit
给定< code>equals方法,对散列使用< code >分子*分母将是无效的方法。使用< code>1/4和< code>2/8的示例,< code>1/4.equals(2/8)将返回< code>true,但是< code > 1/4 . hashcode()= = 2/8 . hashcode()将计算为< code>4 == 16,并返回< code>false。

 类似资料:
  • 问题内容: 当大小超过maxthreshold值时,如何在哈希表或哈希表中进行重新哈希处理? 是否所有对都已复制到新的存储桶阵列中? 编辑: 重新哈希后,同一存储桶(位于链接列表中)中的元素会发生什么情况?我的意思是说,他们在重新哈希处理后会留在同一个桶中吗? 问题答案: 问题中的最大阈值称为负载系数。 建议负载系数约为0.75。负载因子定义为(m / n),其中n是哈希表的总大小,m是在需要增加

  • 问题内容: 基本类型(例如int)的哈希码是什么? 例如,假设num是一个整数。 问题答案: 对于一个最自然的选择是使用本身。一个更好的问题是,用什么的的,因为它不适合的尺度的哈希码。您的最佳解决方案以及所有相关问题将是有效的Java。

  • 所以,我有一个带有数组的哈希,就像这样: 我想将它们合并到一个哈希数组中,组合相应的元素。 结果应该是这样的: 知道如何有效地做到这一点吗? 请注意,真实世界的使用场景可能包含数量可变的散列键。

  • 考虑@data是一个带有日期、类、名称和等级字段的Active记录数组。假设我想以两个哈希结束,一个是每个名称的所有日期的唯一集合;另一个按类、日期和名称细分以显示等级。 > 导致错误: nil:NilClass的未定义方法“[]=”

  • 问题内容: 我对哈希表的基本概念感到困惑。如果我要编码一个哈希,我什至会开始吗?哈希表和普通数组之间有什么区别? 基本上,如果有人回答了这个问题,我想我的所有问题都会得到回答:如果我有100个随机生成的数字(作为键),那么我将如何实现哈希表,以及为什么它比数组有优势? 伪代码或Java将被视为一种学习工具… 问题答案: 到目前为止的答案已经帮助定义了哈希表并解释了一些理论,但是我认为一个示例可能会

  • 哈希是键/值对 如果你想按名字查询,那么需要哈希。哈希的键必须唯一,但值可以是任意标量。 有时候你仍然会看到人们称它为“关联数组”,但不要想当然的把它作为数组。 通过键/值对列表来创建哈希 使用键/值对列表创建哈希: my %stooges = ( 'Moe', 'Howard', 'Larry', 'Fine', 'Curly', 'Howard', 'Iggy'