Java - 2개의 Map 합치기 (merge, putAll)

Java에서 두개의 HashMap을 하나의 Map으로 합치는 방법을 소개합니다. 두개의 Map을 합친다는 의미는 B Map에 있는 모든 요소를 A Map에 추가한다는 의미입니다. List의 경우 그냥 합치면 되지만, Map의 경우 key는 같지만 value가 다른 값이 두개의 Map에 있을 때 어떤 value를 사용할지 설정해줘야할 때가 있습니다. 이 글에서는 putAll() 메소드와 merge() 메소드를 이용하여 두개의 Map을 하나의 Map으로 합치는 방법을 소개합니다.

1. putAll() : 두개의 Map을 하나로 합치기

A.putAll(B)는 A의 Map에 B의 Map에 들어있는 요소들을 모두 추가합니다. 중복된 key가 있으면 B의 value로 덮어씁니다.

아래 예제에서 fruits1fruits2의 요소를 모두 추가하는데, "kiwi"만 중복된 key를 갖고 있고 나머지는 아닙니다. 결과를 보면 fruits1이 갖고 있는 kiwi의 value는 fruits2의 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() : 두개의 Map을 하나로 합치기

A.merge(key, value, remappingFunction)는 A의 Map에 key와 value를 추가합니다. putAll()과 차이는 중복된 key가 있을 때 value를 덮어쓰지 않고 어떤 값을 사용할지 결정할 수 있습니다. 이것을 구현하는 객체가 remappingFunction입니다. fruits2.forEach()를 사용하여 fruits2의 모든 요소들을 fruits1에 추가하고 있습니다. for loop 안에서 fruits1에 fruits2의 요소를 추가할 때는 merge()를 사용합니다.

2.1 기존 Map의 value를 사용

아래 예제는 중복된 key가 있을 때, 기존 value를 사용하는 예제입니다. 아래 코드에서 merge()에 인자로 전달되는 remappingFunction은 (v1, v2) -> v1)인데, v1이 기존 Map의 value이고 v2가 새로운 Map의 value일 때 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를 연산한 값 사용

아래 예제는 key가 중복일 때 기존 value와 새로운 value의 합을 value로 사용하는 예제입니다. (v1, v2) -> v1 + v2)처럼 두 값을 합하여 새로운 값을 사용하도록 구현하였습니다.

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}
Loading script...
codechachaCopyright ©2019 codechacha