두 정수 배열 사이의 교차점

1. 개요

이 빠른 자습서에서는 두 Integer 배열 'a''b' 간의 교차점계산하는 방법을 살펴 봅니다 .

또한 중복 항목을 처리하는 방법에 대해서도 중점적으로 설명합니다.

구현을 위해 Streams를 사용 합니다.

2. 배열에 대한 멤버십 술어

두 세트의 교차점은 정의상 두 번째 세트의 일부인 하나의 모든 값을 포함하는 세트입니다.

따라서 두 번째 배열의 멤버 자격을 결정하려면 함수 또는 오히려 술어 가 필요합니다 . 이후 목록 상자에서 이러한 방법을 제공, 우리는이 변환됩니다 목록 :

Predicate isContainedInB = Arrays.asList(b)::contains; 

3. 교차로 구축

결과 배열을 구축하기 위해 첫 번째 집합의 요소를 순차적으로 고려하고 두 번째 배열에도 포함되어 있는지 확인합니다.그런 다음이를 기반으로 새 배열을 만듭니다.

스트림 API가 필요한 방법으로 우리를 제공합니다. 먼저 Stream 을 만든 다음 member- Predicate 로 필터링 하고 마지막으로 새 배열을 만듭니다.

public static Integer[] intersectionSimple(Integer[] a, Integer[] b){ return Stream.of(a) .filter(Arrays.asList(b)::contains) .toArray(Integer[]::new); }

4. 중복 항목

Java의 배열은 Set 구현 이 아니기 때문에 입력과 결과에서 중복 항목 문제에 직면합니다. 결과의 발생 수는 첫 번째 매개 변수의 발생에 따라 다릅니다.

그러나 집합의 경우 요소가 여러 번 발생해서는 안됩니다. distinct () 메서드를 사용하여이를 보관할 수 있습니다 .

public static Integer[] intersectionSet(Integer[] a, Integer[] b){ return Stream.of(a) .filter(Arrays.asList(b)::contain) .distinct() .toArray(Integer[]::new); }

따라서 교차로의 길이는 더 이상 매개 변수 순서에 의존하지 않습니다.

그러나 배열과 자체의 교차점은 이중 항목을 제거하기 때문에 다시 배열이 아닐 수 있습니다.

5. 다중 집합 교차점

여러 개의 동일한 항목을 허용하는보다 일반적인 개념은 다중 집합입니다. 그런 다음 교차는 입력 발생의 최소 수로 정의됩니다. 따라서 우리의 멤버십- 술어 는 결과에 요소를 얼마나 자주 추가하는지 점수를 유지해야합니다.

이를 위해 remove () 메서드를 사용할 수 있으며, 멤버 자격을 반환하고 요소를 소비합니다. 따라서 'b'의 모든 동일한 요소 가 소비 된 후에는 더 이상 동일한 요소가 결과에 추가되지 않습니다.

public static Integer[] intersectionSet(Integer[] a, Integer[] b){ return Stream.of(a) .filter(new LinkedList(Arrays.asList(b))::remove) .toArray(Integer[]::new); } 

때문에 배열의 API는 불변의 반환 목록을, 우리는 헌정 변경 가능한 키를 생성해야합니다.

6. 결론

이 기사에서는 containsremove 메서드를 사용하여 Java에서 두 배열에 대한 교차를 구현하는 방법을 살펴 보았습니다 .

모든 구현, 코드 스 니펫 및 테스트는 GitHub 저장소에서 찾을 수 있습니다.이 저장소는 Maven 기반 프로젝트이므로 그대로 가져 와서 실행하기 쉬워야합니다.