簡體   English   中英

HashMap獲取“相等”但不同哈希的對象的值?

[英]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);
}

在我的代碼中,我將接收包含xy值的事件。 當我收到其中一個事件時,我正在嘗試使用傳遞的xy創建一個新的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計算一個唯一的哈希,它應該防止沖突。

我的問題是: 如何使用新實例pmap檢索值? 是否有其他適合用例的數據結構?

我想我可以使用toString()或其他一些映射,如HashMap<String, T>或者我可能會擴展Point類並Override hashCode()方法以滿足我的目的。 這些方式感覺“hacky”,如果有一種更清潔的方式,我很樂意聽到它。

根據Java文檔

如果兩個對象根據equals(Object)方法equals(Object) ,則對兩個對象中的每一個調用hashCode方法必須生成相同的整數結果。

看起來在你的情況下,兩個Point對象是相等的(根據equals方法),但它們的哈希碼是不同的。 這意味着您需要修復equalshashCode函數以使它們彼此一致。

您可以嘗試編寫一個自包含的示例,例如我們可以運行的跟隨

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()相同的屬性以保持一致。

另請參閱: 在Java中覆蓋equals和hashCode時應考慮哪些問題?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM