두개의 리스트 아이템을 비교해 추가,삭제

최근 두개의 ArrayList의 아이템을 비교해, 추가되는 아이템과 삭제되는 아이템을 구분할 필요가 있어서 만들었습니다.

조건

  • list1 = [a, b, c, d] =>새로 받아온 ArrayList
  • list2 = [a, b, e] => 기존 DB 있던 데이터를 담은 ArrayList
  • 기존 리스트에 영향을 주지 않으며, 새로운 리스트를 생성해 리턴해야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ArrayList<String> resultList = compageAndDel(list1, list2);
for (int i = 0; i < resultList.size(); i++) {
System.out.println("Inst " + resultList.get(i)); // c,d 출력 => DB에 없던, 새롭게 추가될 데이터
}

ArrayList<String> resultList2 = compageAndDel(list2, list1);
for (int i = 0; i < resultList2.size(); i++) {
System.out.println("Del " + resultList2.get(i)); // e 출력 => 기존 DB에 있었지만 삭제된 데이터
}

private static ArrayList<String> compageAndDel(ArrayList<String> target, ArrayList<String> source) {
ArrayList<String> tmpArr = new ArrayList<>();
tmpArr.addAll(target);
for (String item : source) {
if (target.contains(item) == true) {
//일치하는 아이템을 지움
tmpArr.remove(item);
}
}
return tmpArr;
}

위의 코드로 새로 추가될 아이템과 DB에 있었지만 삭제될 아이템을 구분할 수 있습니다.
만약 기존 리스트에 영향을 줘도 된다면 다음과 같이 작성합니다.

1
2
3
4
5
// list1기준 삭제된 요소 리턴 
list1.removeAll(list2); //[c,d]

// list1기준 추가된 요소 리턴
list2.removeAll(list1); //[e]

+2019.7.6 추가
자바8 람다를 이용해 위 코드를 다음과 같이 리팩토링 해 봤습니다.

1
2
3
4
5
6
7
8
9
10
List<String> list1 = new ArrayList<>(Arrays.asList("a", "b", "c", "d"));
List<String> list2 = Arrays.asList("a", "b", "e");

System.out.println(list1.stream()
.filter(x -> !list2.contains(x))
.collect(Collectors.toList())); //[c, d]

System.out.println(list2.stream()
.filter(x -> !list1.contains(x))
.collect(Collectors.toList())); //[e]

과거 코드와 비교해 소스가 깔끔하게 정리된 것을 알 수 있습니다.

스칼라로는 다음과 같이 작성할 수 있습니다.
+scala 버전

val diff1 = list1.diff(list2) //Set(c, d)
val diff2 = list2.diff(list1) //Set(e)

// 공통 아이템만 리턴
var match1 = list1.intersect(list2) // Set(a, b)

읽어주셔서 감사합니다. 혹 오류/문의할 내용이 있다면 코멘트 남겨주세요!🙆