Java: Existe uma maneira fácil e rápida para conjuntos juntos AND, OR, XOR ou?
-
23-08-2019 - |
Pergunta
Isto é, se eu tivesse dois ou mais conjuntos, e eu queria voltar um novo conjunto contendo quer:
- Todos os elementos de cada conjunto tem em comum (AND).
- Todos os elementos total de cada conjunto (OR).
- Todos os elementos únicos para cada conjunto. (XOR).
Existe, uma maneira fácil pré-existente para fazer isso?
Editar:? Essa é a terminologia errada, não é
Solução
Assumindo 2 Set objetos a e b
E (intersecção de dois conjuntos)
a.retainAll(b);
OR (união de dois conjuntos)
a.addAll(b);
XOR quer lançar seu próprio loop:
foreach item
if(a.contains(item) and !b.contains(item) || (!a.contains(item) and b.contains(item)))
c.add(item)
ou faça o seguinte:
c.addAll(a);
c.addAll(b);
a.retainAll(b); //a now has the intersection of a and b
c.removeAll(a);
Outras dicas
Você pode usar o Google-Collections Define classe que tem a intersecção métodos () união () e diferença simétrica ().
Sets.intersection(set1, set2);
Sets.union(set1, set2);
SetView view = Sets.intersection(Sets.union(set1, set2), set3);
Set result = view.copyInto(new HashSet());
@Milhous disse:
Confira a API sets. se você usar addAll você pode obter ou. Se você usar retainAll você pode obter o e. eu não saber sobre o Xor.
Parece que se você tivesse conjuntos s1
e s2
você poderia fazer isso para obter XOR:
- copiar o conjunto
s1
paras3
-
s1.removeAll(s2);
(S1 agora contém todos os elementos não em s2) -
s2.removeAll(s3);
(s2 agora contém todos os elementos não em s3 = o antigo S1) -
s1.addAll(s2);
(S1 agora contém a união do acima de dois conjuntos)
confira os conjuntos api . se você usar addAll você pode obter ou. Se você usar retainAll você pode obter o e. Eu não sei sobre o XOR.
Editar:. a partir da documentação set
... Se a coleção especificada é também um conjunto, a operação addAll modifica eficazmente este conjunto de modo a que o seu valor é a união dos dois conjuntos.
.... Se a coleção especificada é também um conjunto, esta operação modifica eficazmente este conjunto de modo a que o seu valor é a interseção dos dois conjuntos.
Eu tenho certeza que suporta API Jakarta comuns coleções uniões, interseções etc.
Eu ficaria espantado se a API do Google Collections fez não tão bem.