Джава:Есть ли простой и быстрый способ объединить множества AND, OR или XOR?

StackOverflow https://stackoverflow.com/questions/393968

  •  23-08-2019
  •  | 
  •  

Вопрос

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

  1. Все элементы каждого набора имеют общее (И).
  2. Сумма всех элементов каждого набора (ИЛИ).
  3. Все элементы уникальны для каждого набора.(ИСКЛЮЧАЮЩЕЕ ИЛИ).

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

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

Это было полезно?

Решение

Предполагая, что 2 объекта Set a и b

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

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

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

Другие советы

Вы можете использовать Класс наборов Google-Коллекций который имеет методы пересечения(), объединения() и symmetricDifference().

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

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

@Милхаус сказал:

проверьте наборы API.Если вы используете Addall, вы можете получить или.Если вы используете antainall, вы можете получить и.Я не знаю о XOR.

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

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

посмотрите наборы API.если вы используете addAll, вы можете получить или.Если вы используете saveAll, вы можете получить and.Я не знаю насчет Ксора.

Редактировать: из прилагаемой документации.

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

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

Я почти уверен, что API общих коллекций Jakarta поддерживает объединения, пересечения и т. д.

Я был бы удивлен, если бы API коллекций Google не сделал то же самое.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top