[java] Java 세트의 ‘포함’과 같은 것이 있습니까?

같은 유형의 A와 B 두 세트가 있습니다.

A에 세트 B의 요소가 있는지 찾아야합니다.

세트를 반복하지 않고 가장 좋은 방법은 무엇입니까? 설정 라이브러리가 contains(object)하고 containsAll(collection)있지만 containsAny(collection).



답변

Collections.disjoint(A, B)작동 하지 않습니까? 설명서에서 :

지정된 true두 컬렉션에 공통 요소가없는 경우를 반환 합니다.

따라서 false컬렉션에 공통 요소가 포함되어 있으면 메서드가 반환 됩니다.


답변

Stream::anyMatch

Java 8부터 사용할 수 있습니다 Stream::anyMatch.

setA.stream().anyMatch(setB::contains)


답변

세트에 containsAny를 구현하는 좋은 방법은 Guava Sets.intersection ()을 사용하는 것 입니다.

containsAny를 반환 boolean하므로 호출은 다음과 같습니다.

Sets.intersection(set1, set2).isEmpty()

세트가 분리되어 있으면 true를, 그렇지 않으면 false를 반환합니다. 원래 세트를 수정하지 않기 위해 복제를 할 필요가 없기 때문에이 시간의 복잡성은 retainAll보다 약간 낫습니다.


답변

Apache Commons에는 메소드가 CollectionUtils.containsAny()있습니다.


답변

org.apache.commons.collections.CollectionUtils를 사용합니다.

CollectionUtils.containsAny(someCollection1, someCollection2)

그게 다야! 하나 이상의 요소가 두 컬렉션에 모두 있으면 true를
반환 합니다 .

사용하기 쉽고 함수의 이름이 더 암시 적입니다.


답변

retainAll()Set 인터페이스에서 사용하십시오 . 이 방법은 두 세트에서 공통 인 요소의 교차점을 제공합니다. 자세한 내용은 API 문서를 참조하십시오.


답변

HashMap세트 A에서 생성 한 다음 세트 B를 반복하고 B의 요소가 A에 있는지 확인 하는 것이 좋습니다 . O(|A|+|B|)충돌이 없을 때 시간에 retainAll(Collection<?> c)실행되지만 O(|A|*|B|)시간에 실행해야합니다 .