두 세트의 차이 얻기 = new

두 세트가 있다면

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>.


답변

자바 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;
}


답변

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


답변

첫 번째 컬렉션에서 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), " , "));


답변

그냥 여기 (시스템에 하나의 예를 넣어 existingState, 우리는 (제거에없는 요소 요소를 찾으려 newState하지만에 존재 existingState에 (요소 추가) 및 요소를 newState하지만, 현재의하지를 existingState)

public class AddAndRemove {

  static Set<Integer> existingState = Set.of(1,2,3,4,5);
  static Set<Integer> newState = Set.of(0,5,2,11,3,99);

  public static void main(String[] args) {

    Set<Integer> add = new HashSet<>(newState);
    add.removeAll(existingState);

    System.out.println("Elements to add : " + add);

    Set<Integer> remove = new HashSet<>(existingState);
    remove.removeAll(newState);

    System.out.println("Elements to remove : " + remove);

  }
}

결과로 이것을 출력합니다 :

Elements to add : [0, 99, 11]
Elements to remove : [1, 4]