Java: Есть ли простой и быстрый способ создания наборов AND, OR или XOR? - PullRequest
20 голосов
/ 26 декабря 2008

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

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

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

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

Ответы [ 5 ]

34 голосов
/ 26 декабря 2008

Предположим, 2 набора объектов а и 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); 

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

9 голосов
/ 28 декабря 2009

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

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

SetView view = Sets.intersection(Sets.union(set1, set2), set3);
Set result = view.copyInto(new HashSet());
3 голосов
/ 26 декабря 2008

@ Мильхос сказал:

проверить наборы API. если вы используете addAll вы можете получить или. Если вы используете сохранить все, что вы можете получить и. Я не знать о 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 содержит объединение двух вышеуказанных наборов)
1 голос
/ 26 декабря 2008

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

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

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

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

0 голосов
/ 28 декабря 2008

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

Я был бы удивлен, если бы API Google Collections не работал.

...