配对对象覆盖等于使反向对也相同

时间:2017-08-28 23:55:10

标签: java equals

我想定义一个Pair类,其中< 2,3>和< 3,2>是一回事。覆盖了相等的方法,但我不确定如何覆盖哈希码函数来匹配它。我到目前为止的代码是:

 Set<Pair> edgePairs=new HashSet<>();

    edgePairs.add(new Pair(2,3));
    edgePairs.add(new Pair(2,4));
    edgePairs.add(new Pair(2,5));
    edgePairs.add(new Pair(4,2));
    edgePairs.add(new Pair(2,3));
    edgePairs.add(new Pair(3,2)); 

    for (Pair edgePair : edgePairs) {
        System.out.println(edgePair.x+" "+edgePair.y);
    }

输出:

2 3
2 4
2 5
4 2
3 2

正确的输出不应包含对&lt; 4,2&gt;和&lt; 3,2&gt;

配对班级:

 public class Pair
{
    int x, y;

    public Pair(int x, int y) {
        this.x = x;  this.y = y;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Pair that = (Pair) o;
        if ((x == that.y && y == that.x)||(x == that.x && y == that.y))                
              return true;

        return false;
    }

    @Override
    public int hashCode() {
        int result = x; result = 31 * result + y;
        return result;
    }
}

2 个答案:

答案 0 :(得分:2)

如果您只是将hashCode返回x + y,而不将它们中的任何一个乘以31,那么参数的顺序无关紧要。

答案 1 :(得分:0)

你真的很接近,你只需要使哈希函数更具体

@Override
public int hashCode() {
    int a = 0, b = 0;
    if (x > y) {
        a = x;
        b = y
    } else {
        a = y;
        b = x;
    }
    int result = a; result = 31 * result + b;
    return result;
}

或者您可以重做Pair课程,并按升序存储x和y。

无论哪种方式,您都需要将哈希方程中变量的顺序与输入变量的顺序分开。