이 글에서는 ArrayList에서 중복 요소를 제거하는 방법을 알아봅니다. ArrayList 클래스는 java.util 패키지에 포함된 크기 조절이 가능한(resizable) 배열입니다. 기본 배열과 달리 ArrayList는 크기를 동적으로 변경할 수 있어 요소의 추가·삭제가 자유롭다는 큰 장점이 있습니다.
다음은 중복 제거 과정을 보여주는 예시입니다.
입력값 −
입력 리스트 : [150, 250, 300, 250, 500, 150, 600, 750, 300]
기대 출력 −
중복이 제거된 리스트 : [150, 250, 300, 500, 600, 750]
알고리즘
1단계 - 시작 2단계 - 필요한 클래스를 임포트합니다. 3단계 - 데이터 값을 정의합니다. 4단계 - 정수형 ArrayList를 생성하고 요소를 초기화합니다. 5단계 - 콘솔에 ArrayList를 출력합니다. 6단계 - 정수형 LinkedHashSet을 새로 생성합니다. 7단계 - ‘addAll’ 메서드를 사용해 기존 ArrayList의 요소들을 집합에 추가합니다. 8단계 - Set은 중복을 허용하지 않으므로 고유한 값만 저장됩니다. 9단계 - ArrayList의 모든 요소를 삭제(clear)합니다. 10단계 - 고유 요소만 담긴 집합을 콘솔에 출력합니다. 11단계 - 종료
예제 1: main 메서드에서 전체 로직 구현
아래 예제는 모든 연산을 ‘main’ 함수 하나에 묶어 실행합니다.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
public class Demo {
public static void main(String[] args) {
System.out.println("필요한 패키지가 임포트되었습니다");
ArrayList<Integer> input_list = new ArrayList<>(Arrays.asList(150, 250, 300, 250, 500, 150, 600, 750, 300));
System.out.println("정의된 리스트 : " + input_list);
Set<Integer> temp_set = new LinkedHashSet<>();
temp_set.addAll(input_list); // Set은 중복 값을 자동으로 걸러냅니다.
input_list.clear();
input_list.addAll(temp_set);
System.out.println("\n중복이 제거된 리스트 : \n" + input_list);
}
}
실행 결과
필요한 패키지가 임포트되었습니다 정의된 리스트 : [150, 250, 300, 250, 500, 150, 600, 750, 300] 중복이 제거된 리스트 : [150, 250, 300, 500, 600, 750]
예제 2: 객체 지향 방식으로 메서드 분리
이번에는 중복 제거 로직을 별도의 함수로 캡슐화하여 객체 지향 프로그래밍 스타일로 작성합니다.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
public class Demo {
static void remove_duplicates(ArrayList<Integer> input_list) {
Set<Integer> temp_set = new LinkedHashSet<>();
temp_set.addAll(input_list);
input_list.clear();
input_list.addAll(temp_set);
System.out.println("\n중복이 제거된 리스트 : \n" + input_list);
}
public static void main(String[] args) {
System.out.println("필요한 패키지가 임포트되었습니다");
ArrayList<Integer> input_list = new ArrayList<>(Arrays.asList(150, 250, 300, 250, 500, 150, 600, 750, 300));
System.out.println("정의된 리스트 : " + input_list);
remove_duplicates(input_list);
}
}
실행 결과
필요한 패키지가 임포트되었습니다 정의된 리스트 : [150, 250, 300, 250, 500, 150, 600, 750, 300] 중복이 제거된 리스트 : [150, 250, 300, 500, 600, 750]
참고: Java 8 스트림(Stream)으로 더 간결하게
Java 8 이상을 사용한다면 Stream API의 distinct() 메서드를 활용해 한 줄로도 중복을 제거할 수 있습니다.
import java.util.List;
import java.util.stream.Collectors;
List<Integer> uniqueList = input_list.stream()
.distinct()
.collect(Collectors.toList());
왜 하필 LinkedHashSet일까요?
일반 HashSet은 저장 순서를 보장하지 않습니다. 반면 LinkedHashSet은 요소의 삽입 순서를 그대로 유지하기 때문에, 원본 리스트의 순서가 뒤섞이지 않으면서 중복만 깔끔하게 제거됩니다. 조회 및 추가 연산의 시간 복잡도 역시 평균 O(1)로 매우 효율적입니다.