2016-06-16 21 views
8

Bunu yapmanın en temiz yolu ne olurdu?Aynı ada sahip anahtarlarla listelere ekleyerek birden çok Harita <String,List> yapısını birleştirin

Ben

Map<String, List<String>> map1 = ...; 
Map<String, List<String>> map2 = ...; 
Map<String, List<String>> map3 = ...; 

haritalar tüm tam aynı tuşları var ve hiçbir yinelenen değerleri var. Her anahtar için map2 ve map3 listelerini map1 listesinin sonuna eklemek istiyorum. Eğer geçici bir listesini yapmak istemiyorsanız

Map<String, List<String>> conversions = new HashMap<String, List<String>>(); 
List<String> histList = new ArrayList<String>(); 

for(String key : map1.keySet()){ 
    histList.addAll(map1.get(key)); 
    histList.addAll(map2.get(key)); 
    histList.addAll(map3.get(key)); 
    conversions.put(key,histList); 
} 
+0

Döngünün içinde "histList" olduğunu bildirirseniz kodunuz çalışır; böylece her seferinde yeni bir liste alırsınız. –

+0

@LouisWasserman iyi yakalamak. Teşekkürler! – user101

cevap

7

doğrudan Değiştirmek yerine, birini listelemek için ekleyebilirsiniz:

Bu şu anda bunu yapmaya çalışıyorum nasıl.

for (String key: map1.keySet()) { //iterate over all the keys 
    map1.get(key).addAll(map2.get(key)); //add all the values in map 2 to map 1 
    map1.get(key).addAll(map3.get(key)); //add all the values in map 3 to map 1 
} 
+0

Mükemmel! Güzel ve temiz. – user101

+6

Harita araması yapmak için tuşların üzerinde geçiş yapmak (aynı harita üzerinde) gereksiz bir kaynak israfıdır ve hatta * iki kez * araması gerçekleştirirsiniz. Harita aramaları olmadan hem anahtar hem de değer elde etmek için 'entrySet()' yerine basitçe yineleyebilirsiniz. Map1.forEach ((anahtar, değer) -> {value.addAll (map2.get (key)); value.addAll (map3.get (key));}); – Holger