본문 바로가기

Java/Java SE, EE

배열에서 중복되는 Element 제거하기(Set과 Stream)

이 문서의 내용

    더보기

    배열의 중복 Element 제거는 알고리즘 문제에서 자주 사용하는 로직입니다.

    중복 제거 방법은 크게 Set 자료구조를 사용한 방법과 Stream의 함수를 사용하는 방법이 있습니다.

    Set 자료 구조를 사용한 방법

    java.util.Set<E>을 구현하는 HashSet을 사용합니다. Set 자료구조는 중복된 값을 가지지 않는 Collection입니다.

    Java의 Set은 중복된 값을 다시 입력했을 때 Exception을 발생시키지 않고 무효하게 처리합니다.

    결과적으로 단순히 모든 값을 Set에 입력하는 것만으로도 중복 제거가 가능합니다.

    // 중복 제거하는 배열입니다.
    String[] input = new String[] { "H", "E", "L", "L", "O", "W", "O", "R", "L", "D", "!" };
    		
    Set<String> filtered = new HashSet<>(Arrays.asList(input));
    String[] output = filtered.toArray(new String[filtered.size()]);
    		
    // 중복 제거 결과를 출력합니다.
    System.out.println(Arrays.toString(output));
    코드 비고
    Line 3 new HashSet<>(Array.asList(input)) 중복 제거하는 배열을 사용해 HashSet을 구성합니다.
    Line 4 toArray() HashSet을 다시 String[]으로 캐스팅합니다.

    입력된 코드의 출력 결과를 확인합니다.

    [!, R, D, E, W, H, L, O]
    더보기

    HashSet은 순서가 없는 Collection이기 때문에 기존 정렬을 유지하지는 않습니다.

    기존 배열의 순서를 보장하려면 LinkedHashSet을 사용합니다.

    [H, E, L, O, W, R, D, !]

    Stream을 사용한 방법

    Java 8부터는 Stream을 사용 할 수 있습니다. Stream을 사용하면 구현된 코드를 간결하게 구성 할 수 있습니다.

    // 중복 제거하는 배열입니다.
    String[] input = new String[] { "H", "E", "L", "L", "O", "W", "O", "R", "L", "D", "!" };
    		
    String[] output = Arrays.stream(input).distinct().toArray(String[]::new);
    		
    // 중복 제거 결과를 출력합니다.
    System.out.println(Arrays.toString(output));
    코드 비고
    Line 4 Arrays.stream(input) 배열을 사용해 Stream 객체를 생성합니다.
    distinct() Stream에서 중복을 제거합니다.
    toArray(String[]::new) Stream 객체를 다시 String[]으로 캐스팅합니다.

    입력된 코드의 출력 결과를 확인합니다. 예시의 LinkedHashSet처럼 기존 배열의 순서 역시 보장합니다.

    [H, E, L, O, W, R, D, !]
    더보기

    distinct()는 Stream에 저장된 객체 간 중복 검사를 위해 Object.equals(Object)를 호출합니다.

    public boolean equals(Object obj) {
    	return (this == obj);
    }

    정리 및 복습

    • 배열에서 Element 중복을 제거하려면 Set 또는 Stream을 사용합니다.
    • Set은 중복된 값을 허용하지 않는 Collection입니다.
    • Set에 단순히 모든 값을 Set에 입력하는 것만으로도 중복 제거가 가능합니다.
    • Set을 구현하는 자료구조는 HashSet과 LinkedHashSet이 있습니다.
    Set HashSet LinkedHashSet
    중복된 값을 허용하지 않습니다. Set을 구현합니다.
    중복된 값을 허용하지 않습니다.
    입력된 순서를 보장하지 않습니다.
    Set을 구현합니다.
    중복된 값을 허용하지 않습니다.
    입력된 순서를 보장합니다.
    • Stream의 distinct()를 사용하면 Stream에 저장된 값의 중복을 제거합니다.
    • Stream은 Java 8부터 사용 할 수 있습니다.