Java 두 List의 교집합
1. 두 문자열 List의 교집합
일부 중복된 요소가 있는 두 개의 Strings Lists를 교집합으로 만든다.
1
2
List<String> list = Arrays.asList("red", "blue", "blue", "green", "red");
List<String> otherList = Arrays.asList("red", "green", "green", "yellow");
이제 스트림 메서드를 사용하여 목록의 교차점을 결정한다.
1
2
3
4
5
6
7
8
Set<String> result = list.stream()
.distinct()
.filter(otherList::contains)
.collect(Collectors.toSet());
Set<String> commonElements = new HashSet(Arrays.asList("red", "green"));
Assert.assertEquals(commonElements, result);
먼저, distinct로 중복된 요소를 제거한다. 그런 다음 필터를 사용하여 otherList에도 포함된 요소를 선택한다.
마지막으로 출력을 Collector로 변환한다. 교차는 각 공통 요소를 한 번만 포함해야 한다. 순서는 중요하지 않으므로 toSet
이 가장 간단한 선택이지만 toList
또는 다른 수집기 메서드를 사용할 수도 있다.
2. 사용자 지정 클래스 목록의 교차점
List가 String을 포함하지 않고 커스텀 클래스의 인스턴스를 포함하면 Java의 규칙을 따르는 한 스트림 메서드를 사용하는 솔루션은 사용자 정의 클래스에 대해 잘 작동할 것이다.
contains 메서드는 특정 개체가 목록에 표시되는지 여부를 결정하는 방법은 equals 메서드를 재정의하고 관련 속성값을 기반으로 두 개체를 비교하는지 확인해야 한다.
예를 들어 너비와 높이가 같으면 두 개의 사각형이 같다.
equals 메서드를 재정의하지 않으면 클래스는 부모 클래스의 equals 구현을 사용한다. 결국 상속 체인인 Object 클래스의 equals 메서드가 실행된다. 그런 다음 두 인스턴스는 힙에서 정확히 동일한 개체를 참조하는 경우에만 동일하다.
[출처 및 참고]
This post is licensed under CC BY 4.0 by the author.