Javaで2つのHashMapを1つのMapにまとめる方法を紹介します。 2つのMapを組み合わせるという意味は、B Mapのすべての要素をA Mapに追加するという意味です。 List の場合は単に合わせれば良いのですが、Map の場合 key は同じですが value が異なる値が 2 つの Map にあるときにどの value を使用するかを設定しなければならない場合があります。この記事では、 putAll()
メソッドと merge()
メソッドを利用して 2 つの Map を 1 つの Map に合わせる方法を紹介します。
1. putAll() : 2つのMapを1つにまとめる
A.putAll(B)
は、A の Map に B の Map に含まれる要素をすべて追加します。重複したキーがある場合は、Bのvalueで上書きされます。
以下の例では、 fruits1
に fruits2
のすべての要素を追加します。結果を見ると、frusts1が持っているkiwiのvalueはfruts2のvalueで上書きされました。
import java.util.HashMap;
public class MapPutAll {
public static void main(String[] args) {
HashMap<String, Integer> fruits1 = new HashMap<>();
fruits1.put("apple", 100);
fruits1.put("kiwi", 200);
fruits1.put("grape", 300);
System.out.println("HashMap: " + fruits1);
HashMap<String, Integer> fruits2 = new HashMap<>();
fruits2.put("banana", 400);
fruits2.put("kiwi", 500);
fruits2.put("melon", 600);
fruits1.putAll(fruits2);
System.out.println("Updated HashMap: " + fruits1);
}
}
Output:
HashMap: {apple=100, kiwi=200, grape=300}
Updated HashMap: {banana=400, apple=100, kiwi=500, grape=300, melon=600}
2. merge() : 2つのMapを1つにまとめる
A.merge(key, value, remappingFunction)
は A の Map に key と value を追加します。 putAll()
との違いは、重複したキーがあるときにvalueを上書きせずにどの値を使用するかを決定できます。これを実装するオブジェクトはremappingFunctionです。 fruits2.forEach()
を使って fruits2 のすべての要素を fruits1 に追加しています。 for loop の中で fruits1 に fruits2 の要素を追加するときは merge()
を使います。
2.1 既存のMapのvalueの使用
以下の例は、重複したキーがある場合に既存のvalueを使用する例です。以下のコードで merge()
に引数として渡される remappingFunction は (v1, v2) -> v1)
です。
import java.util.HashMap;
public class MapMerge1 {
public static void main(String[] args) {
HashMap<String, Integer> fruits1 = new HashMap<>();
fruits1.put("apple", 100);
fruits1.put("kiwi", 200);
fruits1.put("grape", 300);
System.out.println("HashMap: " + fruits1);
HashMap<String, Integer> fruits2 = new HashMap<>();
fruits2.put("banana", 400);
fruits2.put("kiwi", 500);
fruits2.put("melon", 600);
fruits2.forEach((key, value) -> fruits1.merge(key, value, (v1, v2) -> v1));
System.out.println("Updated HashMap: " + fruits1);
}
}
Output:
HashMap: {apple=100, kiwi=200, grape=300}
Updated HashMap: {banana=400, apple=100, kiwi=200, grape=300, melon=600}
2.2 新しい Map の value の使用
以下の例は、keyが重複しているときに新しいMapのvalueを使用する例です。 (v1, v2) -> v2)
のように新しいMapのvalueを使うように実装しました。
import java.util.HashMap;
public class MapMerge2 {
public static void main(String[] args) {
HashMap<String, Integer> fruits1 = new HashMap<>();
fruits1.put("apple", 100);
fruits1.put("kiwi", 200);
fruits1.put("grape", 300);
System.out.println("HashMap: " + fruits1);
HashMap<String, Integer> fruits2 = new HashMap<>();
fruits2.put("banana", 400);
fruits2.put("kiwi", 500);
fruits2.put("melon", 600);
fruits2.forEach((key, value) -> fruits1.merge(key, value, (v1, v2) -> v2));
System.out.println("Updated HashMap: " + fruits1);
}
}
Output:
HashMap: {apple=100, kiwi=200, grape=300}
Updated HashMap: {banana=400, apple=100, kiwi=500, grape=300, melon=600}
2.3 既存 Map と新しい Map の value を演算した値の使用
以下の例は、キーが重複しているときに既存の値と新しい値の合計を値として使用する例です。 (v1, v2) -> v1 + v2)
のように、2つの値を合計して新しい値を使用するように実装しました。
import java.util.HashMap;
public class MapMerge3 {
public static void main(String[] args) {
HashMap<String, Integer> fruits1 = new HashMap<>();
fruits1.put("apple", 100);
fruits1.put("kiwi", 200);
fruits1.put("grape", 300);
System.out.println("HashMap: " + fruits1);
HashMap<String, Integer> fruits2 = new HashMap<>();
fruits2.put("banana", 400);
fruits2.put("kiwi", 500);
fruits2.put("melon", 600);
fruits2.forEach((key, value) -> fruits1.merge(key, value, (v1, v2) -> v1 + v2));
System.out.println("Updated HashMap: " + fruits1);
}
}
Output:
HashMap: {apple=100, kiwi=200, grape=300}
Updated HashMap: {banana=400, apple=100, kiwi=700, grape=300, melon=600}
Related Posts
- Java - AtomicReference使用方法
- Java - CountDownLatchを使用する方法、および例
- Java - ScheduledThreadPoolExecutor使用方法
- Java - SummaryStatisticsの使用方法(count、min、max、average)
- Java8 - 関数型インタフェース (Functional Interface) について
- Java - String配列をint配列に変換する
- Java - ArrayList要素の値を変更する方法、replaceAll()
- Java - 2つのリストが同じかどうかを比較
- Java - 配列から特定のIndex要素を削除する3つの方法
- Java - HashMapソート、4つの方法
- Java - 文字列を配列に変換する方法
- Java - ArrayListが空であることを確認する3つの方法
- Java - ArrayListの巡回、4つの方法
- Java - ArrayListの最大値、最小 値を見つける
- Java - ArrayListの合計、平均値の計算
- Java - HashMap巡回、3つの方法
- Java - do whileとwhileの違い
- Java - Lambda式と関数型インタフェース
- Java - List empty(null)チェック、3つの方法
- Java - ArrayListの初期化、4つの方法
- Java - Stream.reduce()の使い方と例
- Java - 2つのマップを結合する(merge、putAll)
- Java - java.util.Dateをjava.sql.Dateに変換する
- Java - ArrayListをStringに変換する
- Java - ClassNotFoundExceptionの発生原因と解決策
- Java - 非静的メソッドは静的コンテキストから参照できません
- Java - NoSuchMethodErrorの原因と解決策
- Java - JSONライブラリを使用する方法(JSONObject、JSONArray)
- Java - byte[]配列をFileに保存
- Java - byte[]の配列をStringに変換
- Java - ファイルのアクセス権を確認し、変更
- Java - 一時フォルダ(Temp directory)パスを取得する
- Javaでシェルスクリプトを実行
- Java - Streamを配列に変換する
- Java - リスト重複排除、2つの方法