В моем приложении есть два TreeSet
:
set1 = {501,502,503,504}
set2 = {502,503,504,505}
Я хочу получить симметричную разницу этих наборов, чтобы мой результат был установленным:
set = {501,505}
В моем приложении есть два TreeSet
:
set1 = {501,502,503,504}
set2 = {502,503,504,505}
Я хочу получить симметричную разницу этих наборов, чтобы мой результат был установленным:
set = {501,505}
Вы после симметричной разницы. Это обсуждается в учебном пособии .
Set<Type> symmetricDiff = new HashSet<Type>(set1);
symmetricDiff.addAll(set2);
// symmetricDiff now contains the union
Set<Type> tmp = new HashSet<Type>(set1);
tmp.retainAll(set2);
// tmp now contains the intersection
symmetricDiff.removeAll(tmp);
// union minus intersection equals symmetric-difference
Вы можете использовать CollectionUtils#disjunction
РЕДАКТИРОВАТЬ:
В качестве альтернативы с меньшим количеством pre-Java-5-ness, используйте наборы гуавы #mmetricDifference
Те, кто ищет set subtraction/supplement (несимметричная разность/дизъюнкция), могут использовать CollectionUtils.subtract(a,b)
или Sets.difference(a,b)
.
использовать сохранить все, удалить все then addAll, чтобы сделать объединение существующего набора.
- intersectionSet.retainAll(set2)//intersectionSet - это копия set1
- set1.addAll(SET2);//делаем объединение set1 и set2
- затем удалите дубликаты set1.removeAll(intersectionSet);
Set<String> s1 = new HashSet<String>();
Set<String> s2 = new HashSet<String>();
s1.add("a");
s1.add("b");
s2.add("b");
s2.add("c");
Set<String> s3 = new HashSet<String>(s1);
s1.removeAll(s2);
s2.removeAll(s3);
s1.addAll(s2);
System.out.println(s1);
вывод s1: [a, c]
Вы можете попробовать Sets.symmetricDifference()
из коллекций Eclipse.
Set<Integer> set1 = new TreeSet<>(Arrays.asList(501,502,503,504));
Set<Integer> set2 = new TreeSet<>(Arrays.asList(502,503,504,505));
Set<Integer> symmetricDifference =
Sets.symmetricDifference(set1, set2);
Assert.assertEquals(
new TreeSet<>(Arrays.asList(501, 505)),
symmetricDifference);
Примечание: я являюсь коммиттером для Eclipse Collections.
если мы используем пакет com.google.common.collect, мы можем элегантно найти симметричную разницу следующим образом:
Set<Integer> s1 = Stream.of( 1,2,3,4,5 ).collect( Collectors.toSet());
Set<Integer> s2 = Stream.of( 2,3,4 ).collect( Collectors.toSet());
System.err.println(Sets.symmetricDifference( s1,s2 ));
Выход будет: [1, 5]