2014-07-01 84 views
1

我試圖用鍵值得到一個值。我正在使用get()方法。我的密鑰是一個由int和String組成的對象。所以我做和對象HashMap的get()方法

HashMap<Keys,String> test = readFile(fileName2); 
Keys myKey = new Keys(2,"SM"); 
test.get(myKey); 

而且我收到空。當我看到debbuging模式或當我打印的keySet我收到這樣的

[[email protected], [email protected], [email protected]]

的東西,雖然我的重點應該是

[1,"GM", 2,"SM", 3"PM"]

爲什麼關鍵這個樣子的[email protected],而不是2,"SM"?和如何使用密鑰2,"SM"獲得價值?

我在Keys中重寫toString方法。它看起來更好,但我仍然有空值,並確定有一定的價值。

Keys myKey = new Keys(2,"GL-G--T"); 
    System.out.println(myKey.toString()); 
    System.out.println(test.get(myKey.toString())); 
    Set keyset = test.keySet(); 
    System.out.println(keyset); 


    2,GL-G--T 
    null 
    [3,PNSN--G, 2,GL-G--T, 1,SM] 
+0

你的鑰匙上有toString方法嗎?看起來像正在顯示java對象引用 –

回答

1

可能您正在使用特殊的Keys對象作爲您的哈希映射的關鍵 - 您只需要正確實現hashCode和equals就像別人解釋過的那樣。

除非你有一個特定的原因,不過,你真的可以使用一個字符串作爲哈希映射的關鍵字。創建一些如下的方法:

private static String getHashMapKeyFor(int intKey, String stringKey) { 
    return stringKey + "|" + intKey; 
} 

並聲明你的哈希映射爲一個字符串作爲鍵類型。然後,無論何時您想在哈希映射中放入/找到一個值,請首先調用上述方法以獲取用於哈希映射的實際鍵。

使用自定義對象類可能具有「正確性」或「工程設計性」的表面空氣,但實際上,只是使用字符串通常會表現得很好,如果有的話甚至可以稍微節省內存。

+0

它的工作原理!謝謝! –

4

您需要在您的Keys對象上重寫toString方法。否則,您將獲得default toString provided by java.lang.Object

您可以實現toString方法看起來是這樣的:

public class Keys { 
    private final Integer i; 
    private final String s; 

    public Keys(Integer i, String s) { 
     this.i = i; 
     this.s = s; 
    } 

    @Override 
    public String toString() { 
     return i + "," + s; 
    } 
} 

,如果你想顯示的報價,那麼你就需要提供那些:

return i + ",\"" + s + "\""; 

你此對象還需要override the equals and hashCode作爲地圖中的鑰匙使用:

@Override 
    public boolean equals(Object o) { 
     if (!(o instanceof Keys)) { 
      return false; 
     } 
     Keys other = (Keys)o; 
     return other.s.equals(s) && other.i.equals(i); 
    } 

    @Override 
    public int hashCode() { 
     return toString().hashCode(); 
    } 

如果您不會覆蓋equals和hashcode,那麼該映射使用默認實現,這會導致兩個Keys對象具有相同的值不等。

+0

說實話,這一切都最終被過度工程化,沒有實際的好處。如果hashCode()方法簡單地將關鍵元素串聯到一個字符串中,然後調用hashCode,那麼我就完全不使用特殊的Keys對象,只需使用連接字符串作爲哈希映射的關鍵字! –

+0

@尼爾:我同意這個特殊的例子是過度工程。但是這確實顯示了OP如何使這個對象與地圖一起工作。 –

+0

對不起,是的,我同意 - 這本身就是一個很好的答案。我認爲值得一提的是,最後還有一個更直接的解決方案來解決整體問題! –

0

在您的Keys.java對象中覆蓋toString方法。目前它使用java.lang.Object#toString中定義的方法

+0

其實,解決OP的問題是重寫'hashCode'和'equals'。 –

+0

啊,是的,我錯過了。 Mea culpa David – user3465651

+0

是的,我已經做到了,但仍然有空值的問題 - 我編輯我的代碼,你可以看到打印什麼 –