본문 바로가기

Programming/Java

자바에서 List 중복 제거 방법

반응형

자바에서 List 타입의 데이터에서 중복을 제거하는 방법은 여러 가지가 있습니다.
가장 많이 사용되는 방법은 Set을 활용하는 방법과 Stream API의 distinct() 메서드를 사용하는 방법입니다.


1. Set을 활용한 중복 제거

Set은 중복을 허용하지 않는 자료구조이므로, List를 Set으로 변환하면 자동으로 중복이 제거됩니다.

예제 코드

import java.util.*;

public class RemoveDuplicates {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "apple", "orange", "banana");

        // HashSet을 사용하여 중복 제거
        Set<String> set = new HashSet<>(list);
        List<String> uniqueList = new ArrayList<>(set);

        System.out.println(uniqueList); // [banana, orange, apple] (순서는 보장되지 않음)
    }
}
 

주의사항: HashSet은 요소의 순서를 보장하지 않습니다.
해결 방법: LinkedHashSet을 사용하면 원래 리스트의 순서를 유지할 수 있습니다.

Set<String> set = new LinkedHashSet<>(list);

2. Stream API의 distinct() 메서드 사용

Java 8 이상에서는 Stream의 distinct() 메서드를 사용하면 간단하게 중복을 제거할 수 있습니다.

예제 코드

import java.util.*;
import java.util.stream.Collectors;

public class RemoveDuplicates {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "apple", "orange", "banana");

        // Stream API를 사용한 중복 제거
        List<String> uniqueList = list.stream().distinct().collect(Collectors.toList());

        System.out.println(uniqueList); // [apple, banana, orange] (순서 유지)
    }
}

장점: 원래 리스트의 순서를 유지하면서 중복을 제거할 수 있습니다.


3. Collectors.toSet()을 사용하여 중복 제거

Java 8 이상에서는 Collectors.toSet()을 사용하여 List 데이터를 Set으로 변환하면서 중복을 제거할 수 있습니다.

예제 코드

import java.util.*;
import java.util.stream.Collectors;

public class RemoveDuplicates {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 1, 2, 4, 5);

        // Set으로 변환하여 중복 제거
        List<Integer> uniqueNumbers = numbers.stream()
                .collect(Collectors.toSet())
                .stream()
                .toList();

        System.out.println(uniqueNumbers); // [1, 2, 3, 4, 5] (순서 보장 안됨)
    }
}

단점: Set을 사용하기 때문에 원래 리스트의 순서가 유지되지 않을 수 있습니다.


4. Map을 활용하여 중복 제거

Map을 활용하면 특정 키 값을 기준으로 중복을 제거할 수도 있습니다.

예제 코드

import java.util.*;
import java.util.stream.Collectors;

public class RemoveDuplicates {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "apple", "orange", "banana");

        // LinkedHashMap을 사용하여 중복 제거 및 순서 유지
        List<String> uniqueList = list.stream()
                .collect(Collectors.toMap(s -> s, s -> 1, (oldValue, newValue) -> oldValue, LinkedHashMap::new))
                .keySet().stream().toList();

        System.out.println(uniqueList); // [apple, banana, orange] (순서 유지)
    }
}

장점: 원래 리스트의 순서를 유지하면서 중복을 제거할 수 있습니다.
단점: 코드가 다소 복잡합니다.


5. for 반복문을 사용한 수동 제거

반복문을 사용하여 직접 중복을 제거할 수도 있습니다.

예제 코드

 
import java.util.*;

public class RemoveDuplicates {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 1, 2, 4, 5);
        List<Integer> uniqueList = new ArrayList<>();

        for (Integer num : list) {
            if (!uniqueList.contains(num)) {
                uniqueList.add(num);
            }
        }

        System.out.println(uniqueList); // [1, 2, 3, 4, 5] (순서 유지)
    }
}


장점: 직관적인 코드이며 Java 7 이하에서도 사용 가능합니다.


결론

 

 

방법 중복 제거 순서 유지 성능
HashSet 사용 가능 불가능 빠름 (O(n))
LinkedHashSet 사용 가능 가능 빠름 (O(n))
Stream.distinct() 사용 가능 가능 중간 (O(n))
Collectors.toSet() 사용 가능 불가능 빠름 (O(n))
Map 사용 가능 가능 중간 (O(n))
for 루프 가능 가능 느림 (O(n^2))

추천하는 방법

  • 순서가 중요하지 않다면 Set 사용 (HashSet 또는 LinkedHashSet)
  • 순서를 유지해야 한다면 Stream.distinct() 또는 LinkedHashSet
  • 키 기반으로 중복을 제거해야 한다면 Map 사용
반응형