标准是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
,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
的地板和比较。
这样一些"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
方法具体与语义。
你不能也不应该。
您应该实现一个比较器,并使用它来执行这些操作。