2

我正在尝试在 Java 中为整数元组创建一个 Set。

例如:

class Tuple
{
    int first;
    int second;
    public Tuple(int i, int j)
    {
        this.first=i;
        this.second=j;
    }
}

然后尝试填充这样的集合:

Set pairs = new HashSet<Tuple>();
pairs.add(new Tuple(1,2));
pairs.add(new Tuple(1,2));
pairs.add(new Tuple(1,2));

对于一些元组对象。但我仍然得到重复:

System.out.println("Size: " + pairs.size());
for (Tuple t : (HashSet<Tuple>) pairs) {
    System.out.println(t.toString());
}

任何人都可以帮助摆脱重复?

4

2 回答 2

5

覆盖hashCode()andequals()方法。

当你想说两个对象相等时,它们的 hashCodes 需要以返回相同值并equals()返回 true 的方式实现。当我们尝试将一个对象插入到哈希数据结构中时,它首先调用hashCode()该对象,然后调用equals()该集合中的对象与该对象具有相同哈希码的方法。

我假设你只想要一个Tuple对象HashSet。按如下方式更改您的课程:

public class Tuple {
    int first;
    int second;
    public Tuple(int i, int j){
        this.first=i;
        this.second=j;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + first;
        result = prime * result + second;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Tuple other = (Tuple) obj;
        if (first != other.first)
            return false;
        if (second != other.second)
            return false;
        return true;
    }     
}
于 2013-11-10T01:02:05.967 回答
4

Tuple必须实施hashCodeequals使其在HashSet.

于 2013-11-10T00:58:24.083 回答