Programing

두 세트의 차이 얻기

lottogame 2020. 6. 23. 07:40
반응형

두 세트의 차이 얻기


두 세트가 있다면

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);

세트 #removeAll

이 컬렉션에서 지정된 컬렉션에 포함 된 모든 요소를 ​​제거합니다 (선택적 작업). 지정된 콜렉션도 세트 인 경우,이 조작은 값이 두 세트의 비대칭 세트 차이가되도록이 세트를 효과적으로 수정합니다.


Guava (이전 Google Collections) 라이브러리를 사용하는 경우 해결책이 있습니다.

SetView<Number> difference = com.google.common.collect.Sets.difference(test2, test1);

반환 값 SetViewSet입니다. 변경 불가능하거나 다른 세트로 복사 할 수있는 라이브 표현입니다. 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

반응형