2011-01-06 58 views
3

地圖我有一個地圖數據附加到Java中

Map<Integer, List<Object>> entireData; 

我們這個我添加使用的putAll一些數據,如

entireData.putAll(someData); 

其中someData返回Map<Integer, List<Object>>

現在,我有另一行說

entireData.putAll(someMoreData); 

這也返回Map<Integer, List<Object>>,但通過這樣做它覆蓋現有wholeData的內容,我該如何追加?

回答

5

在Java地圖類參考的第一行:

將鍵映射到值的對象。 A 地圖不能包含重複的鍵;每個鍵可以映射到最多一個值。

+0

是的,我同意,關鍵值是不同的,雖然 – Vivek 2011-01-06 09:29:59

+1

嗯,這不應該發生! putAll()與源集合中的所有項目調用put()相同。 – trojanfoe 2011-01-06 09:32:47

+0

你的評論實際上讓我再看看我的代碼,那是當我意識到我的前一天的代碼更改已導致關鍵值得到重置:(。 – Vivek 2011-01-06 09:37:53

5

你想要一個MultimapGoogle Guava。重寫你的榜樣與番石榴Multimap之:

ListMultimap<Integer, Object> entireData = ArrayListMultimap.create(); 

entireData.get(key)返回List<Object>putAll不會覆蓋舊鍵,但會將這些鍵的值附加到現有值。這比自己初始化List實例要好得多。

4
for (Integer key : someMoreData.keySet()) 
{ 
    if (entireData.containsKey(key)) 
    { 
     entireData.get(key).addAll(someMoreData.get(key)); 
    } 
    else 
    { 
     entireData.put(key, someMoreData.get(key)); 
    } 
} 
2

鑰匙是唯一的。如果someMoreData具有與entireData中的已有鍵相同的鍵,則對象列表的值將被覆蓋。

但是您可以循環在someMoreData和追加對存在於entireData

for(Integer key: someMoreData.keySet()){ 
     if(entireData.get(key)!=null) 
      entireData.get(key).addAll(someMoreData.get(key)); 
     else 
      entireData.put(key,someMoreData.get(key)); 
} 
2

每默認鍵,爪哇地圖地圖一個鍵一個值,as trojanfoe writes。如果這不足以滿足您的需求,您需要一個Multi-Map實現(從鍵映射到一組值的映射)。

最流行的版本可以在兩個開源框架中找到,Google GuavaApache Commons/Collections

番石榴實施例:

final Multimap<Integer, String> mmap = 
    Multimaps.newSetMultimap(
     Maps.<Integer, Collection<String>> newHashMap(), 
     new Supplier<Set<String>>(){ 

      @Override 
      public Set<String> get(){ 
       return Sets.newHashSet(); 
      } 
     }); 
mmap.put(1, "foo"); 
mmap.put(1, "bar"); 
System.out.println(mmap.get(1)); 

輸出:

[富,巴]

共享類別實例:

final MultiMap mmap = new MultiHashMap(); 
mmap.put(1, "foo"); 
mmap.put(1, "bar"); 
System.out.println(mmap.get(1)); 

輸出:

[富,巴]

正如你所看到的,共享集合版本是簡單了很多,但它也不太強大,而且在目前的版本沒有關係不支持Java 1.5泛型。所以我會選擇番石榴。