2

整数のタプルの Set を Java で作成しようとしています。

例えば:

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()およびメソッドをオーバーライドしequals()ます。

2 つのオブジェクトが等しいと言いたい場合、それらの hashCode は、同じ値をequals()返し、true を返すように実装する必要があります。オブジェクトをハッシュ データ構造に挿入しようとすると、最初hashCode()にそのオブジェクトが呼び出され、次にequals()このオブジェクトと同じハッシュ コードを持つコレクションのオブジェクトを使用してメソッドが呼び出されます。

Tuple私は、あなたが 1 つのオブジェクトだけを必要としていると仮定します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で動作させるには、hashCode実装する必要があります。equalsHashSet

于 2013-11-10T00:58:24.083 に答える