如何正确实现equals(), hashCode()如果值在彼此的范围内?



标准是equals()方法,其中如果双变量的值与另一个对象的双变量值相差在+/- 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,yz,如果x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)应该返回true

new Test(1),new Test(9)new Test(14)将无法通过该测试(假设一个简单的单参数构造函数将其参数赋值给value)。

解决这个问题的一种方法是不检查绝对距离,而是"分类"。你的对象使用一些公式,例如采取value / 10的地板和比较。

这样一些"close"像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()

实现。注意:如果你想要一个问题中描述的比较,但是您不一定需要它由equals()返回,然后添加boolean isClose(Test other)是完全可以的。只有的问题是,你正试图实现equals方法具体与语义。

你不能也不应该。

您应该实现一个比较器,并使用它来执行这些操作。

最新更新