반응형
두 세트의 차이 얻기
두 세트가 있다면
Set<Integer> test1 = new HashSet<Integer>();
test1.add(1);
test1.add(2);
test1.add(3);
Set<Integer> test2 = new HashSet<Integer>();
test2.add(1);
test2.add(2);
test2.add(3);
test2.add(4);
test2.add(5);
그것들을 비교하고 4와 5 세트 만 반환하는 방법이 있습니까?
이 시도
test2.removeAll(test1);
이 컬렉션에서 지정된 컬렉션에 포함 된 모든 요소를 제거합니다 (선택적 작업). 지정된 콜렉션도 세트 인 경우,이 조작은 값이 두 세트의 비대칭 세트 차이가되도록이 세트를 효과적으로 수정합니다.
Guava (이전 Google Collections) 라이브러리를 사용하는 경우 해결책이 있습니다.
SetView<Number> difference = com.google.common.collect.Sets.difference(test2, test1);
반환 값 SetView
은 Set
입니다. 변경 불가능하거나 다른 세트로 복사 할 수있는 라이브 표현입니다. test1
그리고 test2
그대로 남아 있습니다.
예:
test2.removeAll(test1)
이 기능은 변경되지만 test2
보존해야 할 경우 사본을 만듭니다.
또한, 당신은 아마 <Integer>
대신에 의미 했습니다 <int>
.
Java 8을 사용하는 경우 다음과 같이 시도 할 수 있습니다.
public Set<Number> difference(final Set<Number> set1, final Set<Number> set2){
final Set<Number> larger = set1.size() > set2.size() ? set1 : set2;
final Set<Number> smaller = larger.equals(set1) ? set2 : set1;
return larger.stream().filter(n -> !smaller.contains(n)).collect(Collectors.toSet());
}
자바 8
다음 과 같이 유틸리티 메소드를 작성하는 술어를 사용하는 removeIf 를 사용할 수 있습니다 .
// computes the difference without modifying the sets
public static <T> Set<T> differenceJava8(final Set<T> setOne, final Set<T> setTwo) {
Set<T> result = new HashSet<T>(setOne);
result.removeIf(setTwo::contains);
return result;
}
그리고 우리가 여전히 이전 버전에 있다면 removeAll을 다음과 같이 사용할 수 있습니다.
public static <T> Set<T> difference(final Set<T> setOne, final Set<T> setTwo) {
Set<T> result = new HashSet<T>(setOne);
result.removeAll(setTwo);
return result;
}
첫 번째 컬렉션에서 CollectionUtils.disjunction
모든 차이 CollectionUtils.subtract
를 얻 거나 차이를 얻는 데 사용할 수 있습니다 .
이를 수행하는 방법의 예는 다음과 같습니다.
var collection1 = List.of(1, 2, 3, 4, 5);
var collection2 = List.of(2, 3, 5, 6);
System.out.println(StringUtils.join(collection1, " , "));
System.out.println(StringUtils.join(collection2, " , "));
System.out.println(StringUtils.join(CollectionUtils.subtract(collection1, collection2), " , "));
System.out.println(StringUtils.join(CollectionUtils.retainAll(collection1, collection2), " , "));
System.out.println(StringUtils.join(CollectionUtils.collate(collection1, collection2), " , "));
System.out.println(StringUtils.join(CollectionUtils.disjunction(collection1, collection2), " , "));
System.out.println(StringUtils.join(CollectionUtils.intersection(collection1, collection2), " , "));
System.out.println(StringUtils.join(CollectionUtils.union(collection1, collection2), " , "));
참고 URL : https://stackoverflow.com/questions/18644579/getting-the-difference-between-two-sets
반응형
'Programing' 카테고리의 다른 글
Android 프로젝트에서 사용하지 않는 문자열을 찾는 간단한 방법이 있습니까? (0) | 2020.06.23 |
---|---|
관리자에게 Django 앱에 자세한 이름을 지정할 수 있습니까? (0) | 2020.06.23 |
MySQL에서 현재 날짜와 시간을 얻는 방법? (0) | 2020.06.23 |
SQL과 응용 프로그램의 계산 수행의 장단점은 무엇입니까? (0) | 2020.06.23 |
HTML에서 텍스트를 굵게 표시하려면 어떻게해야합니까? (0) | 2020.06.23 |