본문 바로가기
[JAVA]/JAVA 기본

자바에서 중복 요소를 남김없이 모두 제거하는 방법

by 황원용 2024. 3. 21.
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에서 지우므로 결과적으로 중복 요소는 하나도 남김없이 제거된다.

 

 

 

참고

뤼튼

https://stackoverflow.com/questions/44558042/how-to-remove-all-the-occurences-of-a-element-if-its-duplicate-in-an-arraylist

 

728x90