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
'Programing' 카테고리의 다른 글
Composer로 단일 라이브러리를 업데이트하는 방법은 무엇입니까? (0) | 2020.03.28 |
---|---|
데이터 프레임에서 열을 어떻게 재정렬합니까? (0) | 2020.03.28 |
터미널 창의 너비와 높이는 어떻게 찾습니까? (0) | 2020.03.28 |
PEM 인코딩 인증서에서 SSL 인증서 만료 날짜를 결정하는 방법은 무엇입니까? (0) | 2020.03.28 |
Java 문자열에서 선행 및 후행 공백 제거 (0) | 2020.03.28 |