두 세트가 있다면
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>
.
답변
자바 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]