我試圖在數據結構中存儲一個密鑰的多個值,所以我使用的是Guava(Google集合)的MultiMap。Java MultiMap無法識別密鑰
Multimap<double[], double[]> destinations = HashMultimap.create();
destinations = ArrayListMultimap.create();
double[] startingPoint = new double[] {1.0, 2.0};
double[] end = new double[] {3.0, 4.0};
destinations.put(startingPoint, end);
System.out.println(destinations.containsKey(startingPoint));
它返回false。
注意:鍵值存儲在multimap中,因爲destinations.size()
在我放置某些東西時增加。當鍵爲String
而不是double[]
時,也不會發生鍵值。
任何想法是什麼問題?
編輯:非常感謝喬恩斯基特我現在實現的類:
class Point {
double lat;
double lng;
public boolean equals(Point p) {
if (lat == p.lat && lng == p.lng)
return true;
else
return false;
}
@Override
public int hashCode() {
int hash = 29;
hash = hash*41 + (int)(lat * 100000);
hash = hash*41 + (int)(lng * 100000);
return hash;
}
public Point(double newlat, double newlng) {
lat = newlat;
lng = newlng;
}
}
而且現在我有一個新的問題。這是我如何使用它:
Multimap<Point, Point> destinations = HashMultimap.create();
destinations = ArrayListMultimap.create();
Point startingPoint = new Point(1.0, 2.0);
Point end = new Point(3.0, 4.0);
destinations.put(startingPoint, end);
System.out.println(destinations.containsKey(startingPoint));
System.out.println(destinations.containsKey(new Point(1.0, 2.0)));
第一個返回true,第二個返回false。它給了我一個錯誤,如果我把@Override
equals
方法之前。任何想法現在是什麼問題?
謝謝:)
EDIT2:現在的行爲完全如預期,當我改變equals
這樣:
@Override
public boolean equals(Object p) {
if (this == p)
return true;
else if (!(p instanceof Point))
return false;
else {
Point that = (Point) p;
return (that.lat == lat) && (that.lng == lng);
}
}
謝謝大家。
有一個[相關問題](http://stackoverflow.com/questions/16839182/can-a-java-array-be- used-as-a-hashmap-key)用於普通Java「Map」情況。 – Raedwald 2015-02-26 12:57:39