私は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
は、私が何をしないのですときに私が人気?間違って何かを実装しましたか?
hashCodeも上書きする必要があります。等しいCoordinatesオブジェクトは異なるハッシュコードを持ち、異なるバケットに入れられるため、equalsメソッドは呼び出されません。 –
public int hashCode(){戻り値Arrays.hashCode(coords); } –