2015-04-16 110 views
0

我有一個2個屬性的列表,即實體和應用程序。幾個實體可以是一個應用程序的一部分。現在,我想將具有相同應用程序的所有實體映射到一個應用程序列表。爲此,我宣佈HashMap <String, List <String>>2個屬性的映射

在迭代實體列表時,我希望將它們逐個添加到應用程序列表中。 在C++中,我可以使用一個映射,其中m [appName]會給出鏈接列表頭並使用我可以添加到現有列表的映射。在hashmap中,我需要放入(key,value)對,但是如何將其添加到應用程序的實體的現有列表中?

+0

請分享當前如何做。你有嘗試過什麼嗎? – aProgrammer

+0

現在我迭代多次,選擇一個appName,然後在該迭代中,我將具有此appName的所有實體添加到列表中。最後在迭代結束時,我將這個創建的列表添加到HashMap中。但是這是多餘的,因爲我運行循環n^2次。 –

+0

我需要類似m [appName]的東西,這將使我可以將該實體添加到具有相同appName的實體的現有列表中,或者在該appName下創建具有該實體的新列表。這將使我能夠運行循環n次,其中我可以只寫:m [appName] .add(current_entity_name) –

回答

0

從我的理解它會像,我用Set代替List到一個應用程序中執行條目的獨特性

public class MapAdder { 
    private Map<String, Set<String>> app2entryMap = new HashMap<>(); 

    ... 

    public boolean addMapping(final String app, final String entry) { 
     Set<String> entries = app2entryMap.get(app); 

     if (entries == null) { 
      entries = new HashSet<String>(); 
      app2entryMap.put(app, entries); 
     } 

     return entries.add(entry); 
    } 
} 

注意。如果它不是你的情況/你不需要它 - List是好的,可能工作更快。

還要注意的是應該有一個正確的hashCode()/equals()實施放入HashSet真正的對象等見http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()

0

事實證明我使用HashMap中的get方法爲我的目的。我這樣使用它:

m.get(key).add(value) 

其中在'關鍵'只是appName和值是實體ID。唯一需要注意的是,對於第一次插入,我必須做一個空檢查,如果我發現'get'返回null,我創建了一個我自己的List並插入它。