Programing

Java 세트의 '포함'과 같은 것이 있습니까?

lottogame 2020. 3. 28. 10:11
반응형

Java 세트의 '포함'과 같은 것이 있습니까?


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

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

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


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

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

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


자바 8 : 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 문서를 참조하십시오.


retainAll 메소드 를 사용 하여 두 세트의 교차점을 얻을 수 있습니다 .


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


그렇게하는 약간 거친 방법이 있습니다. A 집합이 호출보다 일부 B 요소를 포함하는 경우에만

A.removeAll(B)

A 세트를 수정합니다. 이 상황에서 removeAll은 true를 리턴합니다 ( removeAll docs에 명시된대로 ). 그러나 아마도 A 세트를 수정하고 싶지 않아서 다음과 같이 사본에 대한 행동을 생각할 수 있습니다.

new HashSet(A).removeAll(B)

세트가 구별되지 않으면, 즉 비어 있지 않은 교차가있는 경우 반환 값은 참이됩니다.

Apache Commons Collection 도 참조하십시오

참고 URL : https://stackoverflow.com/questions/8708542/something-like-contains-any-for-java-set

반응형