자바에서 두 목록의 교차점

1. 개요

이 자습서에서는 두 List 의 교차점을 검색하는 방법을 배웁니다 .

다른 많은 것들과 마찬가지로 Java 8에 스트림이 도입되어 훨씬 쉬워졌습니다.

2. 두 문자열 목록의 교차점

교차 가있는 StringList 두 개를 만들어 보겠습니다. 둘 다 중복 된 요소가 있습니다.

List list = Arrays.asList("red", "blue", "blue", "green", "red"); List otherList = Arrays.asList("red", "green", "green", "yellow");

이제 스트림 메서드를 사용하여 목록의 교차점을 결정합니다 .

Set result = list.stream() .distinct() .filter(otherList::contains) .collect(Collectors.toSet()); Set commonElements = new HashSet(Arrays.asList("red", "green")); Assert.assertEquals(commonElements, result);

먼저, distinct를 사용 하여 중복 된 요소를 제거합니다 . 그런 다음 필터 를 사용 하여 otherList에 포함 된 요소를 선택합니다 .

마지막으로 Collector 로 출력을 변환합니다 . 교차점은 각 공통 요소를 한 번만 포함해야합니다. 순서는 중요하지 않으므로 toSet 은 가장 간단한 선택이지만 toList 또는 다른 수집기 메서드를 사용할 수도 있습니다 .

자세한 내용은 Java 8 수집기 가이드를 참조하세요.

3. 사용자 지정 클래스 목록의 교차점

ListString이 아니라 우리가 만든 커스텀 클래스의 인스턴스를 포함 한다면 어떨까요? 글쎄, 우리가 Java의 규칙을 따르는 한 스트림 메소드가있는 솔루션은 사용자 정의 클래스에 대해 잘 작동합니다.

contains 메서드는 특정 개체가 목록에 표시되는지 여부를 어떻게 결정합니까? equals 방법을 기반으로합니다 . 따라서 equals 메서드 를 재정의 하고 관련 속성의 값을 기반으로 두 개체를 비교해야합니다.

예를 들어 두 직사각형은 너비와 높이가 같으면 동일합니다.

equals 메서드를 재정의하지 않으면 클래스는 부모 클래스 의 equals 구현을 사용합니다 . 하루가 끝나면 또는 오히려 상속 체인에서 Object 클래스의 equals 메서드가 실행됩니다. 그러면 두 인스턴스는 힙에서 정확히 동일한 객체를 참조하는 경우에만 동일합니다.

equals 메소드 에 대한 자세한 정보는 Java equals ()hashCode () 계약 에 대한 기사를 참조하십시오 .

4. 결론

이 빠른 기사에서는 스트림을 사용하여 두 목록의 교차점을 계산하는 방법을 살펴 보았습니다. 꽤 지루한 작업이 많이 있지만 Java Stream API에 대한 방법을 알고 있다면 매우 간단합니다. 여기에서 Java 스트림에 대한 추가 자습서를 살펴보십시오.

코드 예제는 GitHub에서 사용할 수 있습니다.