![](/img/trans.png)
[英]How to correctly implement equals(), hashCode() for Tree in Java?
[英]How to correctly implement equals(), hashCode() if the values are within a range of each other?
标准是equals()
方法,如果 double 变量的值在另一个对象的 double 变量值的 +/- 10 范围内,则对象被视为相等。
我不确定如何正确实现hashCode()
以便 hashCode 在满足equals()
方法的条件时相等。
非常感谢您的意见! 谢谢!
public class Test
{
private double value;
private boolean isEqualValues (final double valueOne, final double valueTwo)
{
if(valueOne == valueTwo)
{
return true;
}
else if((valueOne - valueTwo <= 10) &&
(valueOne - valueTwo >= -10))
{
return true;
}
else
{
return false;
}
@Override
public boolean equals(final Object o)
{
if (this == o)
{
return true;
}
if (o == null || getClass() != o.getClass())
{
return false;
}
Test test = (Test) o;
if(isEqualValues(test.value, value))
{
return true;
}
else
{
return false;
}
}
//How to implement hashCode()
@Override
public int hashCode()
{
//unsure how to correctly implement hashCode() so that the hashCode would be equal if it
//satisfies the conditions of the equals() method above
}
}
没有办法始终如一地实现这一点,因为equals()
需要传递性:
它是可传递的:对于任何非空引用值
x
、y
和z
,如果x.equals(y)
返回true
并且y.equals(z)
返回true
,那么x.equals(z)
应该返回true
。
new Test(1)
、 new Test(9)
和new Test(14)
将无法通过该测试(假设一个简单的单参数构造函数将其参数分配给value
)。
解决此问题的一种方法是不检查绝对距离,而是使用某种公式对对象进行“分类”,例如value / 10
的底数并进行比较。
这样,像new Test(9)
和new Test(11)
这样的“关闭”值将比较为不相等,但除此之外,您会得到与您所描述的类似的结果。
private long getEquivalenceGroup() {
return Math.floorDiv((long) value, 10);
}
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Test test = (Test) o;
return test.getEquivalenceGroup() == this.getEquivalenceGroup();
}
@Override
public int hashCode()
{
return Long.hashCode(getEquivalenceGroup());
}
只要getEquivalenceGroup()
以稳定的方式实现,这将产生“组”的稍微不同的对象,这些对象仍然比较相等并且具有有效的hashCode()
实现。
你不能也不应该。
您应该实现一个比较器并使用它进行此类操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.