2017-10-20 9 views
0

私はGuavaのHashMultimapの目的を理解してくれることを願っています。HashMultimap Guava Java、キー値からコレクションを取得する際の問題

私は、キーはそうのようなクラスである特定のキーからコレクションにアクセスしようとしている

...

public class Coords { 

private int[] coords; 

public Coords() { 
    coords = new int[2]; 
} 

public Coords(int x, int y) { 
    coords = new int[] {x, y}; 
} 

public void set(int x, int y) { 
    coords = new int[] {x, y}; 
} 

public int x() { 
    return coords[0]; 
} 

public int y() { 
    return coords[1]; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null || getClass() != obj.getClass()) 
     return false; 

    Coords o = (Coords) obj; 

    return Integer.compare(x(), o.x()) == 0 && 
      Integer.compare(y(), o.y()) == 0; 
} 

私はそれの配列に同じ整数値を持つ2つのCOORDSオブジェクトを比較すると、I真実になる

私はキーと値のペアでHashMultimapを使用していましたが、実際には一意のキーセットを取得しますが、複数のアイテムのコレクションを取得しません。 Objectでequals()メソッドをオーバーライドしたにもかかわらず、同一であるように見える複数のキーを取得します。地図...

HashMultimap<Coords, Item> items = HashMultimap.create(); 

     Item s = new Item(); 
     s.coords.set(0, 0); 
     Item w = new Item(); 
     w.coords.set(0, 0); 

     Item p = new Item(); 
     p.coords.set(1, 1); 

     items.put(s.coords, s); 
     items.put(w.coords, w); 
     items.put(p.coords, p); 

     Collection<Item> bucket = items.get(s.coords); 
     bucket.add(s); 
     items.putAll(s.coords, bucket); 

     bucket = items.get(w.coords); 
     bucket.add(w); 
     items.putAll(w.coords, bucket); 

     bucket = items.get(p.coords); 
     bucket.add(p); 
     items.putAll(p.coords, bucket); 

     for(Coords key : items.keySet()) { 
      System.out.println(key.x() + " " + key.y()); 
     } 

私は出力を得る...

0 0 
1 1 
0 0 

は、私が何をしないのですときに私が人気?間違って何かを実装しましたか?

+1

hashCodeも上書きする必要があります。等しいCoordinatesオブジェクトは異なるハッシュコードを持ち、異なるバケットに入れられるため、equalsメソッドは呼び出されません。 –

+1

public int hashCode(){戻り値Arrays.hashCode(coords); } –

答えて

0

すべてのコメントありがとうございます。私は実際に私はこの質問を投稿した直後にhashCode()メソッドを上書きする必要があることを知った。もちろん...

しかし、この問題に悩まされている方々のために、hashCode()の実装方法を理解していない人達のために、説明します。この質問は...私はこのようなのhashCode()を実装することになった、CPPの初心者へ

@Override 
public int hashCode() { 
    int hash = 1; 
    for (int e : coords) 
     hash = 31 * hash + e; 

    return hash; 
} 

感謝を...

Does hashcode implementation of Java Arrays.hashcode() uniformly distribute

を鉱山と非常によく似て答えを持っている。しかし、私が使用している可能性がArrays.hashCode()、しかし、私はそれが動作することを確認できるように何かを書くだろうと思った。だから私はその方法とそれが何をするのかをよく理解することができた。

関連する問題