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

Java로 ArrayList에서 중복 요소 제거하는 방법 완벽 가이드

이 글에서는 Java의 ArrayList에서 반복(중복) 요소를 제거하는 방법을 단계별로 알아보겠습니다.

ArrayList 클래스는 AbstractList를 상속하고 List 인터페이스를 구현한 클래스로, 필요에 따라 크기가 자동으로 늘어나는 동적 배열을 지원합니다. ArrayList는 초기 크기를 지정하여 생성하며, 이 크기를 초과하면 컬렉션이 자동으로 확장됩니다. 반대로 요소가 삭제되면 배열의 크기는 줄어들 수도 있습니다.

문제 정의

예를 들어 다음과 같은 리스트가 있다고 가정해 보겠습니다.

입력 리스트: [Java, Scala, JavaScript, Scala]

여기서 우리가 원하는 결과는 'Scala'처럼 중복된 요소를 제거한 리스트입니다.

중복 제거 후 리스트: [Java, Scala, JavaScript]

알고리즘

중복 제거는 Set 컬렉션이 중복 값을 허용하지 않는다는 특성을 활용합니다. 처리 순서는 다음과 같습니다.

1단계 - 시작
2단계 - ArrayList(input_list)와 Set(temp)을 선언한다.
3단계 - 리스트에 값을 추가한다.
4단계 - 리스트를 Set으로 변환하여 중복을 제거한다.
5단계 - 결과를 출력한다.
6단계 - 종료

이때 LinkedHashSet을 사용하면 원본 리스트의 삽입 순서가 그대로 유지되므로, 순서가 중요한 경우에 유용합니다.

예제 1: main 메서드에서 직접 처리

첫 번째 방법은 모든 연산을 main 함수 안에서 한 번에 수행하는 방식입니다.

import java.util.*;
public class Demo {
    public static void main(String args[]) {
        ArrayList<String> input_list = new ArrayList<String>();
        input_list.add("Java");
        input_list.add("Scala");
        input_list.add("JavaScript");
        input_list.add("Scala");
        System.out.println("입력 리스트: " + input_list);
        Set<String> temp = new LinkedHashSet<>(input_list);
        List<String> result_list = new ArrayList<>(temp);
        System.out.println("중복 제거 후 리스트: " + result_list);
    }
}

실행 결과

입력 리스트: [Java, Scala, JavaScript, Scala]
중복 제거 후 리스트: [Java, Scala, JavaScript]

예제 2: 객체 지향 방식으로 함수 분리

두 번째 방법은 중복 제거 로직을 별도의 함수로 캡슐화하여 객체 지향 프로그래밍 스타일로 작성하는 것입니다. 코드의 재사용성과 가독성이 향상됩니다.

import java.util.*;
public class Demo {
    static void remove_duplicates(ArrayList<String> input_list){
        Set<String> temp = new LinkedHashSet<>(input_list);
        List<String> result_list = new ArrayList<>(temp);
        System.out.println("중복 제거 후 리스트: " + result_list);
    }
    public static void main(String args[]) {
        ArrayList<String> input_list = new ArrayList<String>();
        input_list.add("Java");
        input_list.add("Scala");
        input_list.add("JavaScript");
        input_list.add("Scala");
        System.out.println("입력 리스트: " + input_list);
        remove_duplicates(input_list);
    }
}

실행 결과

입력 리스트: [Java, Scala, JavaScript, Scala]
중복 제거 후 리스트: [Java, Scala, JavaScript]

추가 팁: Java 8 스트림(Stream) 활용

Java 8 이상을 사용한다면 Stream API의 distinct() 메서드를 활용해 더욱 간결하게 중복을 제거할 수 있습니다.

List<String> result_list = input_list.stream()
                                     .distinct()
                                     .collect(Collectors.toList());

이 방식은 별도의 Set 변환 과정 없이 한 줄로 처리할 수 있어 코드가 깔끔하며, 원본 리스트의 순서도 유지됩니다.

정리

ArrayList의 중복 요소 제거는 LinkedHashSet을 활용하는 방법과 Java 8의 Stream API를 사용하는 방법 두 가지가 대표적입니다. 요소의 순서를 유지해야 한다면 LinkedHashSet 또는 distinct()를 사용하는 것이 좋으며, 재사용 가능한 코드를 만들려면 예제 2처럼 기능을 별도의 메서드로 분리하는 것이 바람직합니다.