2012-06-13 46 views
2

去除共entires我有兩個包含HashMap,在兩種語言的特定vocabs說英語和german.I想以連接這兩個地圖返回一個map.I嘗試:連接兩個包含HashMap,而不同時從地圖

hashmap.putall() 

但是,刪除了一些在兩個地圖中都很常見的條目,並且只用單個條目替換它。但是我想保留這兩個詞都是完整的,只是將它們連接起來。有什麼方法可以做到嗎?如果沒有其他辦法的話。我更喜歡hashmap中的任何方法。

[編輯]

爲了更清晰,讓我們看看這兩張圖

 at the 500 um die 500 
     0 1 2  0 1 2 

resutls到

at the 500 um die 500 
    0 1 2 3 4 5    
+0

你的鑰匙是什麼?你的價值是什麼? –

+2

呃...你希望'hashMap.get(key)'在合併之後返回什麼? –

+1

哈希映射不支持重複鍵。所以它會用新鍵覆蓋更早的鍵。 – Santosh

回答

1

您不能直接使用Map實現,因爲在地圖中,每個密鑰都是唯一的。

可能的解決方法是使用Map<Key, List<Value>>,然後手動連接您的地圖。使用鏈接地圖列表的好處是,可以輕鬆地檢索每個單獨的值,而無需任何額外的操作。

喜歡的東西,將工作:

public Map<Key, List<Value>> concat(Map<Key, Value> first, Map<Key, Value> second){ 
    Map<Key, List<Value>> concat = new HashMap<Key, List<Value>>(); 
    putMulti(first, concat); 
    putMulti(second, concat); 
    return concat; 
} 

private void putMulti(Map<Key, Value> content, Map<Key, List<Value>> dest){ 
    for(Map.Entry<Key, Value> entry : content){ 
     List<Value> vals = dest.get(entry.getKey()); 
     if(vals == null){ 
      vals = new ArrayList<Value>(); 
      dest.put(entry.getKey(), vals); 
     } 
     vals.add(entry.getValue()); 
    } 
} 
2

沒有像在Java主庫本身的東西,你將不得不使用谷歌Guava的Multimap等第三方提供的東西,它完全符合你的要求,或者手動構建這樣的東西。

您可以下載番石榴圖書館at the project's website。使用多重映射是一樣的使用地圖,如:

Multimap<String,String> both = new ArrayListMultimap <String,String>(); 
both.putAll(german); 
both.putAll(english); 

for (Entry<String,String> entry : both.entrySet()) { 
    System.out.printf("%s -> %s%n", entry.getKey(), entry.getValue()); 
} 

此代碼將打印所有key-value雙包括那些存在於兩個地圖的人。因此,如果您在germanenglish上都有me->me,則會打印兩次。

+0

...''Multimap'怎麼做OP要的? –

+0

multimap是一個集合,它允許您爲同一個鍵具有多個值,正是他正在查找的內容,而不是在其他答案顯示時連接值。 –

+0

OP指定他想要連接。 'Multimap'沒有提供。 –

5

你必須編寫自己的自定義「中的putAll()`方法那麼像這樣的東西會工作:。

HashMap<String> both = new HashMap<String>(english); 

for(String key : german.keySet()) { 
    if(english.containsKey(key)) { 
     both.put(key, english.get(key)+german.get(key)); 
    } 
} 

這第一張英HashMap然後在所有的德語單詞放,串聯如果有重複的鍵,你可能想要某種分隔符的像之間,以便以後可以提取兩個/

1

到@ tskuzzy的回答類似

Map<String, String> both = new HashMap<String, String>(); 

both.putAll(german); 
both.putAll(english); 
for (String e : english.keySet()) 
    if (german.containsKey(e)) 
     both.put(e, english.get(e) + german.get(e)); 
1

@tskuzzy和@彼得的回答這裏輕微即興創作。通過擴展HashMap來定義您自己的StrangeHashMap

public class StrangeHashMap extends HashMap<String, String> { 
    @Override 
    public String put(String key, String value) { 
     if(this.containsKey(key)) { 
      return super.put(key, super.get(key) + value); 
     } else { 
      return super.put(key, value); 
     } 
    } 
} 

你可以使用它作爲這樣:

Map<String, String> map1 = new HashMap<String, String>(); 
map1.put("key1", "Value1"); 
map1.put("key2", "Value2"); 

Map<String, String> map2 = new HashMap<String, String>(); 
map2.put("key1", "Value2"); 
map2.put("key3", "Value3"); 

Map<String, String> all = new StrangeHashMap(); 

all.putAll(map1); 
all.putAll(map2); 

System.out.println(all); 

上面印下了我:

{key3=Value3, key2=Value2, key1=Value1Value2} 
1

鑑於問題的新元素,似乎有什麼你實際上需要使用的是列表。在這種情況下,你可以這樣做:

List<String> english = ...; 
List<String> german = ...; 
List<String> concat = new ArrayList<String>(english.size() + german.size()); 
concat.addAll(english); 
concat.addAll(german); 

你就在那裏。您仍然可以使用concat.get(n)來檢索級聯列表中的第n個值。