이 글에서는 Java의 ArrayList에서 중복된 항목을 제거하는 다양한 방법을 예제 코드와 함께 소개합니다.
ArrayList에서 문자열 중복 제거하기
Set 컬렉션은 중복 요소를 저장할 수 없다는 특징이 있습니다. 이 특성을 활용하면, 중복이 포함된 ArrayList를 Set 객체 생성 시 생성자의 매개변수로 전달하여 손쉽게 중복을 제거할 수 있습니다.
예제 코드는 다음과 같습니다:
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.Set;
public class RemoveDuplicatesFromArrayList {
public static void main(String[] args) {
ArrayList<String> pets = new ArrayList<>();
pets.add("cat");
pets.add("dog");
pets.add("cat");
pets.add("hamster");
System.out.println(pets);
Set<String> hashSet = new LinkedHashSet(pets);
ArrayList<String> removedDuplicates = new ArrayList(hashSet);
System.out.println(removedDuplicates);
}
}
실행 결과:
[cat, dog, cat, hamster]
[cat, dog, hamster]
여기서 LinkedHashSet을 사용하면 중복 제거와 동시에 원본 리스트의 삽입 순서까지 유지할 수 있다는 장점이 있습니다. 만약 순서가 중요하지 않다면 HashSet을 사용해도 무방합니다.
- Java에서 두 개의 ArrayList 비교하는 방법
- Java에서 ArrayList 순회하는 방법
- Java에서 List를 배열로 변환하는 방법
리스트에서 정수 중복 제거하기
문자열뿐만 아니라 정수(Integer) 리스트에서도 동일한 방식으로 중복을 제거할 수 있습니다.
import java.util.*;
public class RemoveDuplicatesFromArrayList {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1,2,2,2,3,5);
System.out.println(numbers);
Set<Integer> hashSet = new LinkedHashSet(numbers);
ArrayList<Integer> removedDuplicates = new ArrayList(hashSet);
System.out.println(removedDuplicates);
}
}
실행 결과:
[1, 2, 2, 2, 3, 5]
[1, 2, 3, 5]
Java 8 Stream으로 리스트 중복 제거하기
Java 8부터 도입된 Stream API를 사용하면 더욱 간결하게 중복을 제거할 수 있습니다. stream()과 distinct() 메서드를 조합하면 한 줄로 해결됩니다.
import java.util.*;
import java.util.stream.Collectors;
public class RemoveDuplicatesFromArrayList {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1,2,2,2,3,5);
System.out.println(numbers);
List<Integer> removedDuplicates = numbers.stream()
.distinct()
.collect(Collectors.toList());
System.out.println(removedDuplicates);
}
}
실행 결과:
[1, 2, 2, 2, 3, 5]
[1, 2, 3, 5]
정리하면, Java에서 리스트의 중복을 제거하는 대표적인 방법은 두 가지입니다. 첫째, Set의 중복 불가 특성을 활용해 LinkedHashSet으로 변환 후 다시 리스트로 만드는 방법이고, 둘째, Java 8 이상 환경에서 Stream.distinct()를 사용하는 방법입니다. 원본 순서를 유지해야 한다면 두 방법 모두 적합하며, 코드 가독성 측면에서는 Stream API 방식이 더 우수합니다.