希望我理解番石榴中HashMultimap的目的,因为如果我不这样做,我只会低估自己。
我正在尝试从特定键访问Collection,其中键是类似的类......
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;
}
当我比较两个Coords对象在其数组中具有相同的整数值时,我得到了真的。
当我使用键/值对欢迎HashMultimap时,我确实得到了一组唯一的键,但我没有得到多个Item的集合。我得到了多个似乎相同的键,即使我已经覆盖了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
我错过了什么?我是否错误地实施了某些内容?
答案 0 :(得分:0)
感谢所有评论。我实际上意识到我需要在发布此问题后立即覆盖hashCode()方法。当然......
但是我会解释,对于那些坚持这个问题的人,并且不理解如何成功实现hashCode()。这个问题的答案与我的非常相似......
Does hashcode implementation of Java Arrays.hashcode() uniformly distribute
但是,我最终实现了这样的hashCode()......
@Override
public int hashCode() {
int hash = 1;
for (int e : coords)
hash = 31 * hash + e;
return hash;
}
感谢cpp初学者,我本可以使用Arrays.hashCode(),但只是想我会写出一些东西,以便我能看到它正常工作。所以我可以更好地理解方法及其作用。