자바

[Java] 배열에 중복된 값 제거하는법 (Set)

planting grass 2023. 4. 28. 18:23
728x90

배열에서 중복값을 제거하는 방법은 크게 2가지(Set, Stream)가 있다.

1. Set

Java에서 Set은 중복을 허용하지 않는 컬렉션 인터페이스다.

Set은 순서가 없는 요소들의 집합으로, 원소들이 추가된 순서나 삽입된 위치에 따라 인덱스를 갖지 않는다.

Java에서는 Set 인터페이스를 구현한 여러 클래스들이 있다. 그 중 가장 일반적인 클래스로는 (HashSet, TreeSet, LinkedHashSet)들이 있다.

한번 순서대로 알아보자.

1-1 HashSet

해싱(Hashing) 알고리즘을 사용하여 요소들을 저장하는 Set입니다. HashSet중복을 허용하지 않으며, 순서가 보장되지 않는다.

코드

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

public class Main {

    public static void main(String[] args) {
        String[] arr = {"A", "r", "r", "a", "y"};

        HashSet<String> hashSet = new HashSet<>(Arrays.asList(arr));

        String[] resultArr = hashSet.toArray(new String[0]);

        System.out.println(resultArr.length);
        System.out.println(Arrays.toString(resultArr));
    }
}

결과

7
[a, s, S, t, e, H, h]

위 예제와 같이 hashSet을 사용하면 배열의 중복을 제거할 수 있다.

여기서 조심해야 할점은 HashSet은 순서가 없다는것이다.

때문에 순서를 유지해야 하거나, 순서를 보장해야 한다면 LinkedHashSet를 사용해야 한다.

1-2 LinkedHashSet

LinkedHashSet은 내부적으로 해싱(Hashing)과 연결 리스트(Linked List)를 사용하여 요소들을 저장한다.

따라서 LinkedHashSetHashSet과 달리 요소들의 순서가 보장된다.

또한 LinkedHashSetHashSet과 마찬가지로 검색 및 삽입 속도가 빠르므로 대용량 데이터의 검색이나 중복 요소를 제거할 때 유용하다.

LinkedHashSet의 주요 메서드로는 add(), remove(), contains() 등이 있다. 또한 LinkedHashSet은 null 값을 요소로 가질 수 있다.

코드

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

public class HasshSet {

    public static void main(String[] args) {
        String[] arr = {"A", "r", "r", "a", "y"};

        LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>(Arrays.asList(arr));

        String[] resultArr = linkedHashSet.toArray(new String[0]);

        System.out.println(resultArr.length);
        System.out.println(Arrays.toString(resultArr));
    }
}

결과

4
[A, r, a, y]

1-3 TreeSet

TreeSet은 레드-블랙 트리(Red-Black Tree) 알고리즘을 사용하여 요소들을 저장한다. TreeSet중복을 허용하지 않으며, 요소들은 오름차순으로 정렬된다.

코드

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

public class Main {

    public static void main(String[] args) {
        String[] arr = {"A", "r", "r", "a", "y"};

        HashSet<String> hashSet = new HashSet<>(Arrays.asList(arr));

        String[] resultArr = hashSet.toArray(new String[0]);

        System.out.println(resultArr.length);
        System.out.println(Arrays.toString(resultArr));
    }
}

결과

4
[A, a, r, y]

결과값이 오름차순으로 나오는걸 확인이 가능하다.

2. Stream

distinct()

이 경우에는 java 8 Version이상인 경우에 사용이 가능하다.

Stream이란 컬렉션 데이터(배열, 리스트, 셋 등)의 처리를 더 효과적으로 하기 위한 개념이다.

Stream은 데이터의 연속적인 흐름으로서, 데이터를 처리하고 변환하는 작업을 간단하고 가독성 있게 표현할 수 있도록 도와준다.

중복 값을 제거하려면 distinct() 메서드를 사용해야 한다.

distinct() 메서드를 사용하려면 Stream 패키지와 Stream API의 기능을 사용해야 한다.

이말은 즉, java.util.stream.Collectors을 import를 해야 한다는 것이다.

distinct() 메서드는 스트림에서 중복을 허용하지 않으며, 순서가 보장되지 않는다.

코드

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

public class Main {
    public static void main(String[] args) {
        String[] arr = {"A", "r", "r", "a", "y"};

        String[] resultArr = Arrays.stream(arr).distinct().toArray(String[]::new);
        System.out.println(resultArr.length);
        System.out.println(Arrays.toString(resultArr));
    }
}

결과

4
[A, r, a, y]
728x90