두 개의 리스트를 서로 비교해 한쪽에만 존재하는 값을 찾아야 할 때가 있습니다. 예를 들어 데이터 동기화 전후의 목록을 대조하거나 변경된 항목만 추려야 하는 경우입니다. 이번 글에서는 Java를 이용해 두 리스트 사이의 누락된 값과 새로 추가된 값을 찾아내는 방법을 알아보겠습니다.
예제 코드
import java.util.*;
public class Demo{
public static void main(String[] args){
List my_list_1 = new ArrayList();
List my_list_2 = new ArrayList();
my_list_1.add(new Integer("101"));
my_list_1.add(new Integer("90"));
my_list_1.add(new Integer("34"));
my_list_2.add(new Integer("34"));
my_list_2.add(new Integer("67"));
my_list_2.add(new Integer("90"));
for(int i = 0; i < my_list_1.size(); i++){
if (my_list_2.contains(my_list_1.get(i)))
continue;
else
System.out.println("The missing element is : "+my_list_1.get(i));
}
for(int j=0; j<my_list_2.size();j++){
if (my_list_1.contains(my_list_2.get(j)))
continue;
else
System.out.println("The new element in the list is : "+my_list_2.get(j));
}
}
}실행 결과
The missing element is : 101 The new element in the list is : 67
코드 동작 원리
Demo 클래스의 main 메서드 안에서 두 개의 ArrayList(my_list_1, my_list_2)가 생성되며, add() 메서드를 통해 각 리스트에 정수 요소들이 추가됩니다.
첫 번째 for 루프는 첫 번째 리스트(my_list_1)의 요소를 하나씩 순회하면서, 해당 요소가 두 번째 리스트(my_list_2)에도 존재하는지 contains() 메서드로 확인합니다. 요소가 존재하면 continue 문으로 다음 반복으로 넘어가고, 존재하지 않으면 그 요소가 곧 '누락된 값'이므로 콘솔에 출력합니다.
반대로 두 번째 for 루프는 두 번째 리스트를 순회하면서 각 요소가 첫 번째 리스트에 있는지 검사합니다. 첫 번째 리스트에 없는 요소가 발견되면 그것은 '새로 추가된 값'이므로 화면에 표시됩니다.
위 예제에서는 101이 두 번째 리스트에 없어 누락된 값으로, 67이 첫 번째 리스트에 없어 새로 추가된 값으로 각각 출력됩니다.
참고: 성능 개선 팁
contains() 메서드는 리스트를 처음부터 끝까지 탐색하므로 시간 복잡도가 O(n)입니다. 데이터 양이 많다면 리스트를 HashSet으로 변환한 뒤 비교하면 조회 속도가 O(1)에 가까워져 성능이 크게 향상됩니다. 또한 제네릭(List<Integer>)을 사용하면 불필요한 박싱과 형 변환을 줄여 코드의 안정성과 가독성을 높일 수 있습니다.