[英]HashMap get value of object that is “equal” but different hash?
我有一個HashMap<Point, T>
數據結構,它包含幾個映射到T
類其他實例的點。 當我的類被實例化時,這個映射給出了一些默認值:
T t1 = new T();
T t2 = new T();
Point p1 = new Point(0, 1);
Point p2 = new Point(0, 2);
HashMap<Point, T> map = new HashMap<Point, T>();
static {
map.put(p1, t1);
map.put(p2, t2);
}
在我的代碼中,我將接收包含x
和y
值的事件。 當我收到其中一個事件時,我正在嘗試使用傳遞的x
和y
創建一個新的Point
對象,然后從地圖中檢索該值,如下所示:
Point p = new Point(event.getX(), event.getY); // Assume (x, y) = (0, 1) (p1)
if(p.equals(p1)
T t = map.get(p);
雖然在這種情況下p
等於p1
(使用(x,y)=(0,1)我從map
返回一個null
值。我認為這是因為Point (Point2D)
的hashCode()
方法使用了某些東西else然后equals
計算一個唯一的哈希,它應該防止沖突。
我的問題是: 如何使用新實例p
從map
檢索值? 是否有其他適合用例的數據結構?
我想我可以使用toString()
或其他一些映射,如HashMap<String, T>
或者我可能會擴展Point
類並Override
hashCode()
方法以滿足我的目的。 這些方式感覺“hacky”,如果有一種更清潔的方式,我很樂意聽到它。
根據Java文檔 ,
如果兩個對象根據
equals(Object)
方法equals(Object)
,則對兩個對象中的每一個調用hashCode
方法必須生成相同的整數結果。
看起來在你的情況下,兩個Point
對象是相等的(根據equals
方法),但它們的哈希碼是不同的。 這意味着您需要修復equals
和hashCode
函數以使它們彼此一致。
您可以嘗試編寫一個自包含的示例,例如我們可以運行的跟隨
Map<Point, String> map = new LinkedHashMap<>();
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
map.put(new Point(i, j), "(" + i + "," + j + ")");
// test the map
int misMatches = 0;
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++) {
String expected = "(" + i + "," + j + ")";
String text = map.get(new Point(i, j));
if (!expected.equals(text)) {
System.err.println("Expected <" + expected + "> but got <" + text + ">");
misMatches++;
}
}
System.out.println(misMatches + " mis-matches found.");
版畫
0 mis-matches found.
我不認為Point類的equals()或hashcode()有任何問題。試試這個:
public static void main(String args[]) {
Map<Point, Integer> map = new HashMap<Point, Integer>();
Point p1 = new Point(0, 1);
Point p2 = new Point(0, 2);
map.put(p1,1);
map.put(p2,2);
Point p = new Point(0, 1);
if(p.equals(p1)){
System.out.println(map.get(p));
}
else{
System.out.println("not");
}
}
它產生了正確的結果。
我猜你沒有正確地初始化地圖。
hashCode()應使用與equals()相同的屬性以保持一致。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.