Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java List에서 중복 요소 제거하기: LinkedHashSet과 Stream distinct() 활용법

자바(Java)에서 List 컬렉션을 다루다 보면 동일한 값이 여러 번 저장되어 있는 경우가 자주 발생합니다. 이런 중복 요소를 제거하는 대표적인 방법으로는 LinkedHashSet을 활용하는 방식과 Stream API의 distinct() 메서드를 활용하는 방식이 있습니다. 각 방법의 예제 코드와 실행 결과를 살펴보겠습니다.

방법 1: LinkedHashSet으로 중복 제거하기

LinkedHashSet은 Set 인터페이스의 구현 클래스로, 중복 값을 허용하지 않으면서도 요소가 삽입된 순서를 그대로 유지하는 특징이 있습니다. 따라서 List를 LinkedHashSet으로 변환하면 원래의 순서를 지키면서 중복 요소만 손쉽게 걸러낼 수 있습니다.

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.Set;

public class Demo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("Jacob");
        list.add("Gary");
        list.add("Gary");
        list.add("Harry");
        list.add("Harry");
        list.add("Kevin");

        System.out.println("List = " + list);

        Set<String> set = new LinkedHashSet<String>(list);
        System.out.println("List after removing duplicate elements = " + set);
    }
}

실행 결과

List = [Jacob, Gary, Gary, Harry, Harry, Kevin]
List after removing duplicate elements = [Jacob, Gary, Harry, Kevin]

위 코드에서는 "Gary"와 "Harry"가 각각 두 번씩 추가되었지만, LinkedHashSet으로 변환하는 과정에서 중복이 모두 제거되어 [Jacob, Gary, Harry, Kevin]이라는 결과가 출력됩니다.

방법 2: Stream API의 distinct()로 중복 제거하기

자바 8부터 도입된 Stream API를 사용하면 더욱 간결하게 중복을 제거할 수 있습니다. distinct() 메서드는 스트림 내에서 equals() 비교 기준으로 중복된 요소를 필터링해 주며, Collectors.toList()와 함께 사용하면 결과를 새로운 List로 손쉽게 받아올 수 있습니다.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Demo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>(
            Arrays.asList("Ryan", "Kevin", "Ryan", "Harry", "Mark", "Mark"));

        System.out.println("ArrayList = " + list);

        List<String> list2 = list.stream()
            .distinct()
            .collect(Collectors.toList());

        System.out.println("Updated ArrayList without duplicates = " + list2);
    }
}

실행 결과

ArrayList = [Ryan, Kevin, Ryan, Harry, Mark, Mark]
Updated ArrayList without duplicates = [Ryan, Kevin, Harry, Mark]

"Ryan"과 "Mark"가 중복되어 있었지만, distinct() 메서드를 거치면서 처음 등장한 순서대로 한 번씩만 남게 됩니다.

두 방법의 차이점 정리

  • LinkedHashSet 방식: 별도의 Set 객체를 생성해 중복을 제거하며, 어떤 자바 버전에서도 사용할 수 있고 삽입 순서가 항상 유지됩니다.
  • Stream distinct() 방식: 자바 8 이상에서 사용 가능하며, 함수형 스타일로 코드가 간결하고 가독성이 뛰어납니다.

두 방법 모두 요소의 순서를 유지하면서 중복을 제거한다는 공통점이 있으므로, 프로젝트의 자바 버전과 코드 스타일에 맞춰 적절히 선택하면 됩니다.