Javaで2つのマップをマージする
この投稿では、Javaで同じタイプの2つのマップをマージする方法について説明します。このソリューションは、両方のマップのすべてのマッピングを含む新しいマップを返します。マージ操作は、両方のマップに存在する共通のキーを処理します。
1.使用する putAll()
方法
簡単な解決策は、 Map.putAll()
元のマップから別のマップにすべてのマッピングをコピーするメソッド。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { Map<Integer, Character> hm1 = new HashMap<>(); hm1.put(1, 'A'); hm1.put(2, 'B'); Map<Integer, Character> hm2 = new HashMap<>(); hm2.put(3, 'C'); hm2.put(4, 'D'); Map<Integer, Character> map = new HashMap<>(); map.putAll(hm1); map.putAll(hm2); System.out.println(map); } } |
出力:
{1=A, 2=B, 3=C, 4=D}
キーの場合は注意してください k
両方のマップに存在し、の値は hm2
の値を上書きします hm1
。すなわち、 map[k] = hm2[k]
。例えば、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { Map<Integer, Character> hm1 = new HashMap<>(); hm1.put(1, 'A'); hm1.put(2, 'B'); Map<Integer, Character> hm2 = new HashMap<>(); hm2.put(3, 'C'); hm2.put(2, 'D'); Map<Integer, Character> map = new HashMap<>(); map.putAll(hm1); map.putAll(hm2); System.out.println(map); } } |
出力:
{1=A, 2=D, 3=C}
に余分な電話をかけることを避けることができます putAll()
最初のマップをに渡すことによるメソッド HashMap
コンストラクタ。
1 2 |
Map<Integer, Character> map = new HashMap<>(hm1); map.putAll(hm2); |
地図の内容を追加する必要がある場合 hm1
マップする hm2
、あなたはただすることができます:
1 |
hm1.putAll(hm2); |
2.Guavaの使用
Guavaは、を使用して不変のマップインスタンスを作成するためのビルダーも提供します putAll()
メソッド。連続するメソッド呼び出しを連鎖させることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import com.google.common.collect.ImmutableMap; import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { Map<Integer, Character> hm1 = new HashMap<>(); hm1.put(1, 'A'); hm1.put(2, 'B'); Map<Integer, Character> hm2 = new HashMap<>(); hm2.put(3, 'C'); hm2.put(4, 'D'); Map<Integer, Character> map = ImmutableMap.<Integer, Character>builder() .putAll(hm1) .putAll(hm2) .build(); System.out.println(map); } } |
出力:
{1=A, 2=B, 3=C, 4=D}
3.Java8の使用
Java 8以降では、両方のマップの要素のストリームを取得して、 Collectors.toMap()
指定されたマッピング関数を適用して、すべてのマップ要素を新しいマップに収集し、キーと値の識別に役立てます。これを以下に示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; public class Main { public static void main(String[] args) { Map<Integer, Character> hm1 = new HashMap<>(); hm1.put(1, 'A'); hm1.put(2, 'B'); Map<Integer, Character> hm2 = new HashMap<>(); hm2.put(3, 'C'); hm2.put(4, 'D'); Map<Integer, Character> map = Stream.of(hm1, hm2) .flatMap(m -> m.entrySet().stream()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); System.out.println(map); } } |
出力:
{1=A, 2=B, 3=C, 4=D}
上記のコードはスローします java.lang.IllegalStateException
重複するキーが両方のマップに存在する場合。これを処理するには、同じキーに関連付けられた値間の衝突を解決するマージ関数を提供します。
次のコードは BinaryOperator
重複するキーの値をマージします。ここで、古い値はストリーム内の新しい値よりも優先されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; public class Main { public static void main(String[] args) { Map<Integer, Character> hm1 = new HashMap<>(); hm1.put(1, 'A'); hm1.put(2, 'B'); Map<Integer, Character> hm2 = new HashMap<>(); hm2.put(2, 'C'); hm2.put(3, 'D'); Map<Integer, Character> map = Stream.of(hm1, hm2) .flatMap(m -> m.entrySet().stream()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue)); System.out.println(map); } } |
出力:
{1=A, 2=B, 3=D}
これで、Javaで同じタイプの2つのマップをマージすることができます。