어제 오늘 내일

[Java] 배열 중복 값 제거하기 (Set, Stream) 본문

IT/Java

[Java] 배열 중복 값 제거하기 (Set, Stream)

hi.anna 2021. 5. 3. 08:08

 

배열에서 중복값을 제거하는 방법입니다.

  1. Set
  2. Stream

 

 

1. Set

Set은 중복된 값을 가지지 않는 Collection입니다.

따라서, 배열을 Set 타입으로 변환하면, 중복을 제거할 수 있습니다.

1.1 HashSet

HashSet은 Set 인터페이스를 구현한 클래스입니다.

  코드  

import java.util.Arrays;
import java.util.HashSet;

public class RemoveArrayDuplication {
    public static void main(String[] args) {
        
        // 배열 준비
        String[] arr = { "H", "E", "L", "L", "O" };

        // 배열을 HashSet으로 변환
        HashSet<String> hashSet = 
                new HashSet<>(Arrays.asList(arr));

        // HashSet을 배열로 변환
        String[] resultArr = hashSet.toArray(new String[0]);

        // Dup이 제거된 배열 출력
        System.out.println(resultArr.length); // 4
        System.out.println(Arrays.toString(resultArr)); // [E, H, L, O]
        
    }
}

  결과  

4
[E, H, L, O]

위 예제와 같이 HashSet을 이용해서 배열의 중복을 제거할 수 있습니다.

위 예제를 보면 다음 순서로 배열의 중복을 제거하였습니다.

1. 배열을 HashSet으로 변환 (이때, 중복이 제거됩니다)

  - 이때, HashSet의 생성자 파라미터로 List 객체를 전달하였습니다.

  - [Java] 배열을 List로, List를 배열로 변환하기 

2. HashSet을 다시 배열로 변환

  - [Java] 배열을 List로, List를 배열로 변환하기 

 

주의할 것은 HashSet은 순서가 없는 Collection이기 때문에,

HashSet을 다시 배열로 변환했을 때, 원래 배열의 순서를 보장하지 않습니다.

따라서, 배열의 순서를 유지해야 한다면,

Set 인터페이스를 구현한 또 다른 클래스인 LinkedHashSet 클래스를 사용해야 합니다.

 

1.2 LinkedHashSet

LinkedHashSet도 Set 인터페이스를 구현한 클래스이기 때문에,

중복된 값을 가지지 않습니다.

그리고, HashSet과 달리, 입력된 순서대로 데이터를 관리하기 때문에,

입력된 값의 순서를 보장할 수 있습니다.

따라서, 배열의 순서를 보장하면서, 중복을 제거해야 할 때는 LinkedHashSet을 사용합니다.

 

  코드  

import java.util.Arrays;
import java.util.LinkedHashSet;

public class RemoveArrayDuplication {
    public static void main(String[] args) {
        
        // 배열 준비
        String[] arr = { "H", "E", "L", "L", "O" };

        // 배열을 LinkedHashSet으로 변환
        LinkedHashSet<String> linkedHashSet = 
                new LinkedHashSet<>(Arrays.asList(arr));

        // LinkedHashSet을 배열로 변환
        String[] resultArr = linkedHashSet.toArray(new String[0]);

        // Dup이 제거된 배열 출력
        System.out.println(resultArr.length); // 4
        System.out.println(Arrays.toString(resultArr)); // [H, E, L, O]

    }
}

  결과  

4
[H, E, L, O]

위 예제에서는 LinkedHashSet을 사용했기때문에,

최종 결과를 보면, 

중복은 제거되고, 나머지 원소들의 순서는 유지된 것을 확인할 수 있습니다.

( 배열을 List로, List를 배열로 변환하는 방법은 이 링크를 참조하세요

 

 

 

2. Stream / distinct()

Java 8 이후부터는 Stream을 사용해서 배열의 중복을 제거할 수 있습니다.

  코드  

import java.util.Arrays;

public class RemoveArrayDuplication {
    public static void main(String[] args) {

        // 배열 준비
        String[] arr = { "H", "E", "L", "L", "O" };

        // 배열 => strem => 중복제거 => 배열
        String[] resultArr = Arrays.stream(arr).distinct().toArray(String[]::new);

        // Dup이 제거된 배열 출력
        System.out.println(resultArr.length); // 4
        System.out.println(Arrays.toString(resultArr)); // [H, E, L, O]

    }
}

  결과  

4
[H, E, L, O]

배열의 Stream 객체를 만든 후, 

distinct() 메소드를 사용하여 중복을 제거하였습니다.

그리고, 다시 toArray()  메소드를 사용하여, 

Stream을 String배열로 다시 변환하였습니다.

 


 

Set과 Stream을 이용하여 배열의 중복값을 제거하는 방법을 알아보았습니다.

 

 

반응형
Comments