繁体   English   中英

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

[英]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()需要传递性

它是可传递的:对于任何非空引用值xyz ,如果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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM