Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java로 ArrayList에서 중복 요소 제거하기 – 알고리즘부터 예제 코드까지

이 글에서는 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)로 매우 효율적입니다.