Подтвердить что ты не робот

Java: Есть ли простой, быстрый способ для AND, OR или XOR вместе?

То есть, если у меня было два или более набора, и я хотел вернуть новый набор, содержащий либо:

  • Все элементы, каждый из которых имеет общий набор (AND).
  • Все элементы для каждого набора (OR).
  • Все элементы, уникальные для каждого набора. (Исключающее ИЛИ).

Есть ли простой, уже существующий способ сделать это?

Изменить: Это неправильная терминология, не так ли?

4b9b3361

Ответ 1

Предполагая 2 Задайте объекты a и b

AND (пересечение двух множеств)

a.retainAll(b); 

ИЛИ (объединение двух множеств)

a.addAll(b);

XOR либо сверните свой собственный цикл:

foreach item
if(a.contains(item) and !b.contains(item) ||  (!a.contains(item) and b.contains(item)))
 c.add(item)

или выполните следующее:

c.addAll(a); 
c.addAll(b);
a.retainAll(b); //a now has the intersection of a and b
c.removeAll(a); 

Смотрите Установить документацию и эту страницу. Для большего.

Ответ 2

Вы можете использовать класс Google Collections Sets, который имеет методы intersection() union() и symmetDifference().

Sets.intersection(set1, set2);
Sets.union(set1, set2);

SetView view = Sets.intersection(Sets.union(set1, set2), set3);
Set result = view.copyInto(new HashSet());

Ответ 3

@Milhous сказал:

проверить наборы api. если вы используете addAll вы можете получить или. Если вы используете keepAll вы можете получить и. Я не знать о Xor.

Кажется, что если у вас есть наборы s1 и s2, вы можете сделать это, чтобы получить XOR:

  • скопируйте набор s1 в s3
  • s1.removeAll(s2); (s1 теперь содержит все элементы не в s2)
  • s2.removeAll(s3); (s2 теперь содержит все элементы не в s3 = old s1)
  • s1.addAll(s2); (s1 теперь содержит объединение указанных выше двух наборов)

Ответ 4

проверьте наборы api. если вы используете addAll, вы можете получить или. Если вы используете keepAll, вы можете получить и. Я не знаю о Xor.

Изменить: из установленной документации.

... Если указанный набор также является множеством, операция addAll эффективно изменяет этот набор так, чтобы его значение было объединением двух наборов.

.... Если указанный набор также является множеством, эта операция эффективно изменяет этот набор так, чтобы его значение было пересечением двух наборов.

Ответ 5

Я уверен, что Jakarta Common Collections API поддерживает объединения, перекрестки и т.д.

Я был бы поражен, если API коллекций Google тоже не был.