2012-09-11 100 views
1
// same X, Y value text. 
    TextInfo currXY = new TextInfo(text); 

    ArrayList<TextPosition> currTextArray = textComposition.get(currXY); 
    if(currTextArray != null){ 
     currTextArray.add(text); 
    } else { 
     ArrayList<TextPosition> newTextArray = new ArrayList<TextPosition>(); 
     newTextArray.add(text); 
     if(textComposition.containsKey(currXY)){ 
      System.out.println("processTextPosition : containsKEy "); 
     } 
     textComposition.put(currXY , newTextArray); 
    } 

A HashMap不能有重複或相同的密鑰對嗎?爲什麼這個hashmap有兩次相同的密鑰?

我從hashmap中獲取所有條目,並將這些條目放入一個新的hashmap中。

它繼續像相同的密鑰。

lineSortingMap = new HashMap< TextInfo, ArrayList<TextPosition> >();  
    for (Map.Entry< TextInfo, ArrayList<TextPosition> > entry : textComposition.entrySet()) { 
     TextInfo key = (TextInfo)entry.getKey(); 
     ArrayList<TextPosition> arrayTextPositions = entry.getValue(); 
     if(lineSortingMap.containsKey(key)){ 
      System.out.println("WTFcontainsKey : " + " " + key + " " + key.getX() + " " + key.getY()); 
     } 
     else{ 
      lineSortingMap.put(key , arrayTextPositions); 
     } 
    } 

結果:

WTFcontainsKey : [email protected] 75.307 603.85535 

WTFcontainsKey : [email protected] 71.74238 603.85535 

WTFcontainsKey : [email protected] 66.36187 612.82837 

... 

你能解釋這裏發生了什麼?

爲什麼不打印「processTextPosition:containsKey」?

回答

4

可能是因爲您的Key Object不能正確覆蓋equals()和hashCode()。

Object.hashCode()的文檔,並從Java Tutorial

甚至更​​好的科Object as a Superclass:閱讀Effective Java (2nd Ed) by Joshua Bloch

+1

@JoachimSauer令人驚訝的是Sun/Oracle官方文檔中強調了這一點。 Java教程的Maps部分和HashMap JavaDocs幾乎沒有提到一致的equals()/ hashCode()實現的重要性。 –

+0

我的印象是很多API文檔都是從受正式系統影響的視圖寫成的(「你是什麼意思?」equals()'/'hashCode()你不遵循他們的系統是FUBAR,是不是很明顯?「),而不是真實世界的文檔(」注意,如在這個和這個位置記錄,你**必須確保.. .. 「)。 –

+0

謝謝你的回答:)我重寫equals()和hashCode()。但我不明白,當第一次調用containsKey方法,它返回false ...接下來,我移動該hashmap的條目,但這次containsKey方法返回true – hanbumpark

4

很難知道沒有看到完整的代碼,但我有理由相信,你TextInfo類沒有正確實施equals()hashCode()。實施這兩種方法是作爲HashMap中的關鍵字有用的先決條件。

+0

謝謝你的回答:) 我重寫equals()和hashCode()。但我不明白,當第一次調用containsKey方法時,它返回false ...下一步我移動該散列映射的條目,但這次containsKey方法返回true ... – hanbumpark

+1

@HanbumBak:你是如何實現它的?向我們展示代碼,因爲這是該問題最可能的來源。 –

+0

我解決了這個問題。 :) – hanbumpark

0

對於使用您創建的對象作爲Map中的鍵,您應該覆蓋hashCode()equals()方法。我很確定你的班級TextInfo沒有提供相同的實施。

相關問題