Java ArrayList에서 중복 요소 제거하기
자바의 Set 인터페이스는 중복 요소를 허용하지 않습니다. 이 인터페이스의 add() 메서드는 전달받은 요소를 Set 객체에 추가하며, 추가가 성공하면 true를 반환합니다. 반면 이미 존재하는 요소를 추가하려고 하면 작업이 실패하고 false를 반환합니다.
이러한 Set의 특성을 활용하면 ArrayList 객체의 중복 요소를 손쉽게 제거할 수 있습니다.
중복 제거 절차
- 필요한 ArrayList를 생성하거나 기존 객체를 가져옵니다.
- 빈 Set 객체를 생성합니다.
- ArrayList의 모든 요소를 Set 객체에 추가합니다. 이 과정에서 중복 요소는 자동으로 걸러집니다.
clear()메서드를 사용해 ArrayList의 내용을 모두 삭제합니다.addAll()메서드로 Set 객체의 내용을 다시 ArrayList에 추가합니다.
예제 코드
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class RemovingDuplicates {
public static void main(String[] args){
// ArrayList 객체 생성
ArrayList<String> list = new ArrayList<String>();
list.add("JavaFX");
list.add("Java");
list.add("JavaFX");
list.add("OpenCV");
list.add("Java");
list.add("JOGL");
list.add("JOGL");
list.add("HBase");
list.add("Flume");
list.add("HBase");
list.add("Impala");
System.out.println("ArrayList의 원본 내용 : \n"+list);
// ArrayList의 Iterator 객체 가져오기
Iterator<String> it = list.iterator();
// 빈 Set 객체 생성
Set<String> set = new HashSet<String>();
// ArrayList의 요소를 Set 객체에 추가
while(it.hasNext()) {
set.add(it.next());
}
// ArrayList의 모든 요소 삭제
list.clear();
// Set의 요소를 다시 리스트에 추가
list.addAll(set);
System.out.println("중복 제거 후 ArrayList의 내용 : \n"+list);
}
}
실행 결과
ArrayList의 원본 내용 : [JavaFX, Java, JavaFX, OpenCV, Java, JOGL, JOGL, HBase, Flume, HBase, Impala] 중복 제거 후 ArrayList의 내용 : [JavaFX, Java, OpenCV, JOGL, Flume, Impala, HBase]
추가 팁
요소 순서 유지: HashSet은 저장 순서를 보장하지 않으므로, 원본 리스트의 순서를 그대로 유지하고 싶다면 LinkedHashSet을 사용하세요.
Set<String> set = new LinkedHashSet<String>(list); list.clear(); list.addAll(set);
Java 8 스트림 활용: Java 8 이상에서는 스트림 API의 distinct() 메서드를 사용해 한 줄로 중복을 제거할 수도 있습니다.
List<String> result = list.stream()
.distinct()
.collect(Collectors.toList());