10

我在 HashSet 比较中做了这个测试,equals 没有被调用

我想在 farAway=false 时考虑等于(检查两点距离的函数)

完整的可编译代码,您可以对其进行测试,并说明为什么在此示例中未调用 equals。

public class TestClass{
     static class Posicion
    {
        private int x;
        private int y;

        @Override
        public boolean equals(Object obj) {
            if (obj == null) {
                return false;
            }
            if (getClass() != obj.getClass()) {
                return false;
            }
            final Posicion other = (Posicion) obj;
            if ( farAway(this.x, other.x, this.y, other.y,5)){   
                return false;
            } 
            return true;
        }

        @Override
        public int hashCode() {
            int hash = 7; hash = 59 * hash + this.x; hash = 59 * hash + this.y;
            return hash;
        }

         Posicion(int x0, int y0) {
            x=x0;
            y=y0;
        }

        private boolean farAway(int x, int x0, int y, int y0, int i) {
            return false;
        }
    }

    public static void main(String[] args) {
        HashSet<Posicion> test=new HashSet<>();
        System.out.println("result:"+test.add(new Posicion(1,1)));
        System.out.println("result:"+test.add(new Posicion(1,2)));
    }
}

编辑

- 有没有办法强制HashSet add 来调用equals?

4

4 回答 4

28

如果哈希码不同,则无需调用equals(),因为它保证返回false

这来自于和的总合同equals()hashCode()

如果根据方法两个对象相等equals(Object),则对两个对象中的每一个调用该hashCode方法必须产生相同的整数结果。

现在你的班级正在违反该合同。你需要解决这个问题。

于 2013-01-24T15:30:18.250 回答
10

如果您想equals()始终被调用,只需始终返回,例如0in hashCode()。这样,所有项目都具有相同的哈希码,并且纯粹与equals().

public int hashCode() {
  return 0;
}
于 2013-01-24T15:56:06.683 回答
1

听起来 HashSet 不适合你。听起来您想要一种比较两个位置的自定义方式。而不是说“两个位置完全相等吗?”。相反,您应该考虑使用带有 Comparator 的 TreeSet。这样,您可以编写“IsWithinRangeComparator”并在那里进行范围检查。

于 2013-01-24T15:59:06.530 回答
-1

如上所述,当对象相等时,它们的哈希码也应该相同。您可以对哈希码计算进​​行简单修复,如下所示。

 public int hashCode() {

int hash = 7; hash = 59 * hash + this.x; hash = 59 * hash + this.y;
boolean faraway=farAway(this.x, other.x, this.y, other.y,5);
hash=59*hash+(faraway?1:0); //include faraway also as part of hashcode computation

 return hash;

}

于 2013-01-24T15:43:27.723 回答