2015-04-29 95 views
0

編輯如何存儲具有相同密鑰的散列表中的多個對象?

我已經試過這HashMap with multiple values under the same key,和我的HashMap現在看起來是這樣HashMap<String, List<Place>> placeMap = new HashMap<>();

還試圖把對象,而不是地方(地方是我的超類)。但是,當我建立我的子類,並希望將其添加到HashMap中,我得到:

The method put(String, List) in the type HashMap<String,List<Place>> is not applicable for the arguments (String, NamedPlace)

The method put(String, List) in the type HashMap<String,List<Place>> is not applicable for the arguments (String, DescPlace)

這裏是我加入其創建的錯誤:

NamedPlace p = new NamedPlace(x,y,answer,col,cat); 
       placeMap.put(answer, p); 

DescPlace dp = new DescPlace(x,y,answer, desc, col, cat); 
       mp.add(dp); 
       placeMap.put(answer, dp); 

NamedPlace和DescPlace都是P的子類花邊,我想他們都在同一個HashMap中..

OP

我工作的一個小項目在這裏。問題是我需要在項目的這個部分使用HashMap而不是ArrayList,因爲HashMap對於搜索來說快很多。我創建了一個HashMap是這樣的:

HashMap<String, Object> placeMap = new HashMap<>(); 

該字符串對象的名稱,但事情是,不止一個對象可以有相同的名稱。所以我在我的搜索字段中搜索一個對象,並且我想將所有那些具有該名稱的對象存儲到一個ArrayList中,以便我可以在其中更改信息。

的對象有很多的不同的價值觀,比如姓名,職務,一些布爾等

我需要創建一個hashCode方法到我的對象類應創造一個獨特的哈希碼?

+0

使用'地圖<字符串,列表>' –

+0

由於地圖值現在是一個'名單',你必須'set'和'/從地圖上該類型的GET'對象。要添加一個'NamedPlace',檢索列表(如果存在)並**將NamedPlace添加到列表中** – SJuan76

+0

您非常接近解決方案,只需更改'placeMap.put(answer,p);'到'placeMap.get(answer).add(p);'。確保您不會遇到未初始化的列表中的每個條目。 –

回答

0

使用標準Map<String, List<YourClassHere>>實例時,請務必記住每個條目的地圖值爲List<YourClassHere>,並且不會以任何特殊方式處理它。所以你的情況,如果你有

private Map<String, List<Place>> placeMap = new HashMap<>(); 

然後存儲值,你需要做如下:

NamedPlace p = new NamedPlace(x,y,answer,col,cat); 
List<Place> list = placeMap.get (answer); 
list.add(p); 

然而,這段代碼有一些潛在的問題。

  • 它沒有考慮到answer可能不在placeMap中。
  • 它假設您查詢的每個密鑰總是有一個List<Place>實例。

因此,要解決這些潛在的問題,最好的辦法是做如下(的Java 7和更高版本):

NamedPlace p = new NamedPlace(x,y,answer,col,cat); 

if (placeMap.containsKey (answer) && placeMap.get (answer) != null) { 
    placeMap.get (answer).add(p); 
} else { 
    List<Place> list = new ArrayList<Place>(); // ..or whatever List implementation you need 
    list.add (p); 
    placeMap.put (answer, list); 
} 

如果要通過的地方名單SCNA,代碼看起來像這樣的:

if (placeMap.containsKey (key) && placeMap.get (answer) != null) { 
    for (Place p: placeMap.get (key)) { 
     // Do stuff 
    } 
} 
+0

爲什麼當你不使用它的特性時(假設你使用的是Java 8),你會寫「流API」對於當前的任務肯定是有用的?相反,自2004年泛型引入以來,這是一種普通的java方式。 –

+0

@SME_Dev因爲我使用了'new ArrayList <>()'。誠然,我可以使用Stream API,或者應該有,但是我手動嘗試了代碼而不先在編譯器中嘗試它,並且由於我沒有完全掌握Stream API,因此我選擇不包含它。爲了使OP更簡單,我認爲他在Java中沒有豐富的經驗。 – Laf

+0

嗨,感謝您的反饋Laf,我得到的唯一問題是行'placeMap.get(answer).list.add(p);'我得到'列表無法解析或不是字段錯誤消息..在其他清單工作正常。我甚至試圖移動'列表 list = new ArrayList ();'在每個方法之外 –

相關問題