2016-06-16 6 views
8

これを行う最もクリーンな方法は何でしょうか?複数のマップ<String,List>の構造体を同じ名前のキーで結合することで組み合わせる

私は

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

マップすべてが正確に同じキー、無重複する値を持っています。 map2とmap3のListをmap1のリストの最後にそれぞれのキーに追加したいと思います。

これは、私は現在、それをやろうとしています方法です:

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

ループ内で 'histList'を宣言して、毎回新しいリストを取得すると、コードが機能します。 –

+0

@LouisWasserman良いキャッチ。ありがとう! – user101

答えて

7

あなたは一時的なリストを作成したくない場合は、あなたが直接、代わりにそれを置き換えるので、1をリストに追加することができます。

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

パーフェクト!ニースと清潔。 – user101

+6

(同じマップ上で)マップルックアップを実行するためにキーを反復することは、不要なリソースの浪費であり、ルックアップ*を2回実行しています。代わりに 'entrySet()'を反復して、マップ検索を行わずにキーと値の両方を取得することができます。あなたはmap1.forEach((key、value) - > {value.addAll(map2.get(key)); value.addAll(map3.get(key));}); ' – Holger

関連する問題