2011-07-22 74 views
1

我有代碼,如下所示:問題與使用哈希映射與自定義內部類

private void MethodToDo(SpecialObject o) { 
    Map<InfoObj, Integer> totalNeeds = new HashMap<InfoObj, Integer>(); 

    for (ListObject obj : o.getListOfObjects()) { 
     InfoObj infoObj = new InfoObj(obj.getTitle(), obj.getId()); 
     Integer need = totalNeeds.get(infoObj); 

     if (need == null) { 
      need = new Integer(obj.getNeeded()); 
     } else { 
      need = need + obj.getNeeded(); 
     } 
     totalNeeds.put(infoObj, need); 
    } 
} 

的目的是一種私有內部類(在相同的類作爲方法),看起來像這樣:

private class InfoObj { 
    private String title; 
    private Integer id; 

    public InfoObj(String title, Integer id) { 
     this.title = title; 
     this.id = id; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public Integer getId() { 
     return id; 
    } 

    @Override 
    public boolean equals(Object io2) { 
     if (this == io2) { return true; } 
     if (!(io2 instanceof InfoObj)) { return false; } 
     InfoObj temp = (InfoObj) io2; 
     return this.id.equals(temp.id) && this.title.equals(temp.title); 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 7; 
     int result = 1; 
     result = prime * result 
       + ((this.title == null) ? 0 : this.title.hashCode()); 
     result = prime * result 
       + ((this.id == null) ? 0 : this.id.hashCode()); 
     return result; 
    } 

然而,儘管重寫equals和hashCode方法,HashMap中仍然會包含重複鍵(如標題和id是等效的......但在多個地方仍然顯示)。我認爲我正確地做了一切,但意識到我可能會錯過一些東西...

另外,我知道有重複鍵,因爲我通過keySet循環並輸出結果,導致對象具有相同的標題和id多次出現。

+0

*重複結果*表示重複鍵或重複值? –

+0

你有一個顯示重複鍵的SSCCE嗎?你確定有重複嗎? – jzd

+0

不要相信這和InfoObj有什麼關係。你的hashCode()被調用了嗎? –

回答

0

根據您的評論,一個HashMap不能包含每執行相同的密鑰相同的密鑰將是:

(e.hash == hash && ((k = e.key) == key || key.equals(k))) 

而且因爲你正在跟蹤equals和hashCode合同,你創建的任何對象的位置:

InfoObj infoObj = new InfoObj(obj.getTitle(), obj.getId()); 

使用相同的ID和標題,將被認爲是相同key,如果映射以前包含該鍵的映射關係,則替換舊值。

+1

我確實相信我錯過了。關鍵在重複,這造成了混亂。就好像用於鍵的對象不一樣。 – Unknown

+0

@Unknown如果鍵正在重複,那麼之前的值將被替換爲新的鍵值,鍵的相等性實際上是由您對override方法的替代確定的。因此,您使用相同的id和title創建的任何對象都將替換HashMap上的前一個值。 –

+0

@OscarMk這正是他想要的,但顯然重複鍵出現了。 'equals'和'hashCode'方法看起來很好,所以很奇怪。不明,你能舉個例子嗎?也許用dupe鍵從HashMap的條目列表中粘貼一些輸出。 –

0

在這裏看起來好像一切正​​常。