728x90
💡 자바에서 리스트의 중복 요소를 제거하는 대표적인 방법에는 두 가지가 있다.
1. Set을 이용한 중복 제거
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "A", "C", "B"));
Set<String> setWithoutDuplicates = new LinkedHashSet<>(list);
List<String> listWithoutDuplicates = new ArrayList<>(setWithoutDuplicates);
System.out.println(listWithoutDuplicates); // 출력: [A, B, C]
- Set은 자바 컬렉션 프레임워크의 인터페이스 중 하나로 중복된 요소를 허용하지 않고 순서를 보장하지 않는 자료구조이다.
- 중복을 허용하지 않기 때문에 동일한 요소가 이미 존재할 경우 새로운 요소를 추가하지 않는다.
- 따라서 중복을 제거하거나 고유한 요소를 관리하는 데에 유용하다.
- 첫 번째 예제는 Set을 이용하여 중복을 제거한 후 다시 리스트로 변환하는 방법을 사용하였다.
2. Stream API를 이용한 중복 제거
List<String> list = Arrays.asList("A", "B", "A", "C", "B");
List<String> listWithoutDuplicates = list.stream()
.distinct()
.collect(Collectors.toList());
System.out.println(listWithoutDuplicates); // 출력: [A, B, C]
- Stream API를 사용하면 컬렉션 데이터를 함수형 프로그래밍 방식으로 처리할 수 있으며 병렬 처리도 간단히 수행할 수 있다.
- 데이터의 필터링, 매핑, 정렬, 그룹핑, 집계 등 다양한 작업을 간결하게 수행할 수 있다.
💡만약 중복 요소를 남김없이 모두 제거해야 할 경우에는 어떻게 해야 할까?(중복값이 두 개인 경우 두 개 모두 제거)
3. 중복 요소를 남김없이 모두 제거
// 중복값이 들어있는 리스트
List<String> list = new ArrayList<>();
// A : 3 | D : 2 | B, C, E : 1
list.add("A");
list.add("A");
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("D");
list.add("E");
// 중복 여부를 확인하기 위한 Map
Map<String, Boolean> isDuplicatedMap = new LinkedHashMap<>();
// 리스트를 순회하며 value에 중복 여부 표시(true, false)
list.forEach(e -> isDuplicatedMap.put(e, isDuplicatedMap.containsKey(e)));
// isDuplicatedMap::get은 map에서 각 키에 대한 value(true or false)를 가져온다.
// removeIf 메서드는 해당 키에 대한 value가 true이면 키와 같은 요소를 리스트에서 제거한다.
list.removeIf(isDuplicatedMap::get); // 출력: [B, C, E]
- 주석으로 설명을 달아놓았다.
- 정리하면 Map으로 리스트의 요소를 복사함과 동시에 해당 요소가 이미 Map의 key로 있을 경우 true로 value를 저장한다.
- LinkedHashMap에 이미 존재하는 키를 추가하면 기존 값이 덮어씌워지게 된다.(map의 특성)
- containsKey는 return 타입이 boolean이다.(중복값이 있다면 true)
- 이렇게 되면 중복된 요소가 생기는 시점에 value가 true로 바뀔 것이다.
- removeIf에서는 해당 키에 대한 값이 true일 경우 그 키와 같은 요소를 list에서 지우므로 결과적으로 중복 요소는 하나도 남김없이 제거된다.
참고
뤼튼
728x90
'[JAVA] > JAVA 기본' 카테고리의 다른 글
자바의 Object 클래스와 equals(), hashCode() 메서드에 대해 알아보자 (0) | 2023.08.17 |
---|---|
자바에서 대용량 엑셀 데이터를 읽어들이는 ExcelParser를 만들어보자. (0) | 2023.08.11 |
정적 팩토리 메서드의 특징과 사용법을 예제로 이해하기 (0) | 2023.06.20 |
Comparable과 Comparator.comparing() 간단 정리 (0) | 2023.06.14 |
NPE와 Optional에 대해 간단히 알아보기 (0) | 2023.06.13 |