2016-11-25 2 views
2

キーがStringで、値がArrayListの2つのHashMapがあります。これらの2つのマップを次のようにマージする必要があります。 -2つのマップをマージする<String,List>

  1. キーが存在しない場合、キーは指定された値でマップする必要があります。
  2. keyがすでに存在する場合は、既存の値を新しい値、つまりexistingList.addAll(newList)とマージする必要があります。

初期のコードは多少のように見える - 私はここに重複した要素を気にしないでください

if (map1.containsKey("key")){ 
List l = map1.get ("key"); 
l.addAll(map2.get("key")); 
} 
else{ 
map1.put(map2); 
} 

場合はマップチェックのすべてのキーのために

。これを行うきれいな方法がありますか?私はJava 8で導入されたマージメソッドについて読んだことがあります。しかし値がリストタイプであるので、私はより効率的でクリーンな方法を探しています。

+3

私はあなたがそれを記述したのとまったく同じように書くことを提案します。その後、いつでもそれをリファクタリングすることができます。 – f1sh

+2

最初の試行のコードを追加できますか?これに基づいて、清潔さと効率について話すほうがずっと簡単になるでしょう。 – reto

+2

「*私はここで重複する要素は気にしません」とあなたが何を意味するのか分かりません。それに加えて、 'merge'が行く方法と思われます。' map2.forEach((k、v) - > map1.merge(k、v、(l1、l2) - > {l1.addAll(l2); return l1;})); ' – Holger

答えて

1

このコードが役に立ちますようお願いいたします。リストの1つを反復し、他のリストを追加または更新する必要があります。

public static HashMap<String, ArrayList<Object>> merge(HashMap<String, ArrayList<Object>> list_1, HashMap<String, ArrayList<Object>> list_2) { 
    //Iterate second hash map 
    Iterator it = list_2.entrySet().iterator(); 
    while (it.hasNext()) { 
     Map.Entry pair = (Map.Entry) it.next(); 
     String key = (String) pair.getKey(); 
     ArrayList<Object> value = (ArrayList<Object>) pair.getValue(); 
     if(list_1.containsKey(key)){ 
      //UPDATE 
      list_1.replace(key, value); //Replaces the entry for the specified key only if it is currently mapped to some value. 
     } else { 
      //ADD 
      list_1.put(key, value); 
     } 
    } 
    return list_1; 
} 
1

あなたはMap<String, ArrayList>からguavaさんMultimap

に切り替えた場合はあなたのソリューションは非常に読みやすくなります次にputAll

multimap.putAll(secondMultimap); 
+0

putAll()はJavaのマップでも可能ですが、キーがすでに存在する場合はputAll()が値を置き換えませんか? – raghav

0

で行うことができますマージすると、ここでjava8のMap.mergeを使用してのアプローチです()

//your two input maps 
Map<String, List<String>> input1 = new HashMap<>(); 
Map<String, List<String>> input2 = new HashMap<>(); 
Map<String, List<String>>[] arrr = new Map[]{input1,input2}; 

Map<String, List<String>> merged = new HashMap<>(); 
for(Map<String, List<String>> input:arrr){ 
    for(Entry<String, List<String>> e:input.entrySet()){ 
    merged.merge(e.getKey(), e.getValue(), (v1,v2)->{v1.addAll(v2);return v1;}); 
    } 
} 

これは、出力として1つのマップインスタンスを作成します(merged)。私はこれをテストしなかったので、内側の動作がmergeの場合、v1がある時点でnullになるかどうかはわかりません。

+0

3つ目のマップを作成したいが、もう一方をマージする必要はありません。ありがとう、これを修正しようとします。 – raghav

+0

さらに、ネストされたforループはうまくいかないでしょう。 – raghav

+0

@raghav 2つの入力マップがあるので、外側のループはちょうど2回繰り返されます。また、これらのマップではキーが異なるため、両方でマージする必要があります。だから、それはどうやって良いアイデアではないのですか? – f1sh

関連する問題