Итак, если у меня есть два набора:
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?
test1
содержаться6
, ответ будет 4,5,6? то есть вы хотите симметричную разницу en.wikipedia.org/wiki/Symmetric_differenceОтветы:
Попробуй это
Set # RemoveAll
источник
Set
когда она не определяетunion
,intersection
илиdifference
!!!test1.removeAll(test2);
тот же результат, что иtest2.removeAll(test1);
?test1.removeAll(test2)
это пустой наборtest2.removeAll(test1)
есть{4, 5}
.Если вы используете библиотеку Guava (ранее Google Collections), есть решение:
Возвращается
SetView
aSet
, это живое представление, которое вы можете сделать неизменным или скопировать в другой набор.test1
иtest2
остались нетронутыми.источник
symmetricDifference()
принесет все, кроме пересечения, это не то, о чем просил оригинальный вопрос.Да:
Хотя это будет видоизменяться
test2
, поэтому создайте копию, если вам нужно ее сохранить.Кроме того, вы, вероятно, имели в виду,
<Integer>
а не<int>
.источник
Java 8
Мы можем использовать removeIf, который принимает предикат для написания служебного метода:
И если мы все еще находимся в какой-то предыдущей версии, тогда мы можем использовать removeAll как:
источник
Если вы используете Java 8, вы можете попробовать что-то вроде этого:
источник
Set
них больше ... Поэтому, если вы пытаетесь вычесть меньшееSet
из большегоSet
, вы получите другие результаты.public static <T> Set<T> difference(final Set<T> set1, final Set<T> set2) {
качестве сигнатуры, тогда метод можно использовать как универсальную служебную функцию.Comparator<T>
чтобы иметь возможность настроить сравнение, потому что этогоequals
не всегда достаточно.Вы можете использовать,
CollectionUtils.disjunction
чтобы получить все различия илиCollectionUtils.subtract
получить разницу в первой коллекции.Вот пример того, как это сделать:
источник
CollectionUtils
? Нужно ли предполагать, что это из коллекции Apache Commons?Просто
existingState
приведем один пример (система включена , и мы хотим найти элементы для удаления (элементы, которые неnewState
присутствуют, но присутствуют в нихexistingState
) и элементы, которые нужно добавить (элементы, которые есть,newState
но не присутствуют в нихexistingState
):вывел бы это в результате:
источник