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로 덮어씁니다.
아래 예제에서 fruits1에 fruits2의 요소를 모두 추가하는데, "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}Related Posts
- Java - Unsupported class file major version 61 에러
- Java - String.matches()로 문자열 패턴 확인 및 다양한 예제 소개
- Java - 문자열 공백제거 (trim, replace)
- Java - replace()와 replaceAll()의 차이점
- Java - ArrayList 초기화, 4가지 방법
- Java - 배열 정렬(Sorting) (오름차순, 내림차순)
- Java - 문자열(String)을 비교하는 방법 (==, equals, compare)
- Java - StringBuilder 사용 방법, 예제
- Java - 로그 출력, 파일 저장 방법 (Logger 라이브러리)
- Java IllegalArgumentException 의미, 발생 이유
- Java - NullPointerException 원인, 해결 방법
- Seleninum의 ConnectionFailedException: Unable to establish websocket connection 해결
- Java - compareTo(), 객체 크기 비교
- Java - BufferedReader로 파일 읽기
- Java - BufferedWriter로 파일 쓰기
- Java - BigInteger 범위, 비교, 연산, 형변환
- Java charAt() 함수 알아보기
- Java contains()로 문자(대소문자 X) 포함 확인
- Java - Set(HashSet)를 배열로 변환
- Java - 문자열 첫번째 문자, 마지막 문자 확인
- Java - 문자열 한글자씩 자르기
- Java - 문자열 단어 개수 가져오기
- Java - 1초마다 반복 실행
- Java - 배열을 Set(HashSet)로 변환
- Java - 여러 Set(HashSet) 합치기
- Java - 명령행 인자 입력 받기
- Java - 리스트 역순으로 순회, 3가지 방법
- Java - 특정 조건으로 리스트 필터링, 3가지 방법
- Java - HashMap 모든 요소들의 합계, 평균 계산
- Java - 특정 조건으로 HashMap 필터링
- Java - 싱글톤(Singleton) 패턴 구현
- Java - 숫자 왼쪽에 0으로 채우기
- Java - String 배열 초기화 방법
- Java - 정렬된 순서로 Map(HashMap) 순회
- Java - HashMap에서 key, value 가져오기