2008-12-26 14 views
19

Es decir, si tuviera dos o más conjuntos, y quería devolver un nuevo conjunto que contiene o bien:Java: ¿Existe una manera fácil y rápida de armar conjuntos AND, OR o XOR?

  1. Todos los elementos de cada conjunto tiene en común (Y).
  2. Todos los elementos en total de cada conjunto (O).
  3. Todos los elementos exclusivos de cada conjunto. (XOR)

¿Existe una forma fácil y preexistente de hacerlo?

Editar: Esa es la terminología equivocada, ¿no?

+4

La terminología correcta con conjuntos es unión (o), intersección (y), diferencia simétrica (xor). – Brian

+0

Gracias. Estaba tratando de recordar eso. –

Respuesta

32

Suponiendo 2 fijar objetos a y b

AND (intersección de dos conjuntos)

a.retainAll(b); 

OR (unión de dos conjuntos)

a.addAll(b); 

XOR ya sea rodar su propio bucle:

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

o hacer esto:

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

Véase el Set documentation y esto page. Para más.

+0

La discusión del tutorial sobre conjuntos en http://java.sun.com/docs/books/tutorial/collections/interfaces/set.html también puede ser útil. –

1

mira los conjuntos api. si usa addAll, puede obtener o. Si usa RetenerTodo, puede obtener y. No sé sobre el Xor.

Editar: desde la documentación del conjunto.

... Si la colección especificada también es un conjunto, la operación addAll modifica efectivamente este conjunto de modo que su valor sea la unión de los dos conjuntos.

.... Si la colección especificada también es un conjunto, esta operación modifica efectivamente este conjunto de modo que su valor sea la intersección de los dos conjuntos.

+0

¿No [xor] sería una combinación de [set inicial]? – Esko

3

@Milhous dijo:

Consulta la API de conjuntos. si usa addAll puede obtener o. Si usa retengaTodo, puede obtener y. No conozco sobre el Xor.

Parece como si tuviera conjuntos s1 y s2 que podría hacer esto para conseguir XOR:

  1. copiar el conjunto s1 a s3
  2. s1.removeAll(s2); (S1 ahora contiene todos los elementos que no están en S2)
  3. s2.removeAll(s3); (s2 ahora contiene todos los elementos que no están en s3 = el antiguo s1)
  4. s1.addAll(s2); (S1 ahora contiene la unión de los dos conjuntos anteriores)
0

Estoy bastante seguro de que Yakarta comunes Colecciones API es compatible con las uniones, intersecciones, etc.

me sorprendería si la API de Google Colecciones hizo no tan bien.

+0

Lamentablemente, Commons Collections Lib no ofrece genéricos. –

8

Puede usar el Google-Collections Sets class que tiene los métodos intersection() union() y symmetricDifference().

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

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

Debería enfatizar que las vistas (ofrecidas por las colecciones de google) son un enfoque mucho más eficiente para realizar operaciones de conjuntos cuando tiene conjuntos grandes. Esto es especialmente cierto si no necesita iterar a través de todos los elementos en el resultado; lo está utilizando como una construcción lógica en medio de un algoritmo más complejo. Eche un vistazo a http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Sets.html#union%28java.util.Set,%20java.util.Set%29 por ejemplo. –

+1

Además, Set.symmetricDifference() está disponible para obtener elementos únicos. – Muhd

+0

@DilumRanatunga el enlace está muerto – Devenv

Cuestiones relacionadas