[Java] Map 두개 합치기, 3가지 방법
June 03, 2024
HashMap 등, Map 2개를 하나의 Map으로 합치는 방법에 대해서 알아보겠습니다.
1. Map.putAll()을 이용한 방법
map1.putAll(map2)
은 map1에 map2의 모든 key-value 값을 추가합니다.
Map<String, Integer> mergedMap = new HashMap<>(map1)
: map1의 key-value 값을 갖고 있는 새로운 Map 객체 생성mergedMap.putAll(map2)
: mergedMap에 map2의 모든 key-value 값 추가- 동일한 key가 존재할 때, 늦게 추가되는 map의 key-value로 업데이트 (map1의 “C”-1의 경우, map2의 “C”-3으로 업데이트됨)
import java.util.HashMap;
import java.util.Map;
public class Example {
public static void main(String[] args) {
// 첫 번째 Map 생성
Map<String, Integer> map1 = new HashMap<>();
map1.put("A", 1);
map1.put("B", 2);
map1.put("C", 1);
// 두 번째 Map 생성
Map<String, Integer> map2 = new HashMap<>();
map2.put("C", 3);
map2.put("D", 4);
// 새로운 맵 생성, 두 개의 Map을 하나로 합치기
Map<String, Integer> mergedMap = new HashMap<>(map1);
mergedMap.putAll(map2);
// 합쳐진 Map 출력
System.out.println("Merged Map: " + mergedMap);
}
}
Output:
Merged Map: {A=1, B=2, C=3, D=4}
2. Map.merge()를 이용한 방법
Map.merge()
를 이용하여 두개의 Map을 합칠 수 있습니다.
map1.merge(entry.getKey(), entry.getValue(), (v1, v2) -> v1)
: map1에 entry의 key와 value를 key-value로 추가,(v1, v2) -> v1
은 동일한 key 값이 추가될 때, 이전에 추가된 값(v1)을 사용하겠다는 의미.- 아래 예제에서는 “C”가 중복 key인데, map1이 값이 먼저 추가된 값이고 v1이므로, 결국 1로 업데이트됨
- 중복 key에 대해서 나중에 추가되는 value로 업데이트하려면
(v1, v2) -> v2
로 입력
import java.util.HashMap;
import java.util.Map;
public class Example {
public static void main(String[] args) {
// 첫 번째 Map 생성
Map<String, Integer> map1 = new HashMap<>();
map1.put("A", 1);
map1.put("B", 2);
map1.put("C", 1);
// 두 번째 Map 생성
Map<String, Integer> map2 = new HashMap<>();
map2.put("C", 3);
map2.put("D", 4);
// merge()로 Map 병합
for (Map.Entry<String, Integer> entry : map2.entrySet()) {
map1.merge(entry.getKey(), entry.getValue(), (v1, v2) -> v1);
}
// 합쳐진 Map 출력
System.out.println("Merged Map: " + map1);
}
}
Output:
Merged Map: {A=1, B=2, C=1, D=4}
3. Stream을 이용한 방법
Stream.concat()
을 이용하여 두개의 Map을 하나로 합칠 수 있습니다.
Map을 합칠 때, Collectors.toMap()
을 사용하는데, 동일 key가 추가될 때, 어떤 것을 업데이트할 지 정할 수 있습니다.
Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
: map1과 map2의 key-value를 합침Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1)
: Entry의 getKey()와 getValue() 값을 Map으로 만듬.(v1, v2) -> v1
은 동일한 key를 갖고 있는 Entry를 업데이트할 때 value 값은 map1의 value 값(v1)을 사용하겠다는 의미- 결과를 보면 중복 key 값 “C”는 map1의 value “1”로 업데이트됨
- 중복 key에 대해서 나중에 추가되는 value로 업데이트하려면
(v1, v2) -> v2
로 입력
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Example {
public static void main(String[] args) {
// 첫 번째 Map 생성
Map<String, Integer> map1 = new HashMap<>();
map1.put("A", 1);
map1.put("B", 2);
map1.put("C", 1);
// 두 번째 Map 생성
Map<String, Integer> map2 = new HashMap<>();
map2.put("C", 3);
map2.put("D", 4);
// 두 개의 Map을 스트림을 사용하여 합치기
Map<String, Integer> mergedMap = Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1));
// 합쳐진 Map 출력
System.out.println("Merged Map: " + mergedMap);
}
}
Output:
Merged Map: {A=1, B=2, C=1, D=4}