2008-10-02 8 views
59

¿Hay alguna funcionalidad incorporada para operaciones de conjunto clásico en la clase java.util.Collection? Mi implementación específica sería para ArrayList, pero esto parece algo que debería aplicarse a todas las subclases de Collection. Estoy buscando algo como:Operaciones de conjunto clásico para java.util.Collection

ArrayList<Integer> setA ... 
ArrayList<Integer> setB ... 
ArrayList<Integer> setAintersectionB = setA.intersection(setB); 
ArrayList<Integer> setAminusB = setA.subtract(setB); 

Después de algunas búsquedas, solo pude encontrar soluciones locales. Además, me doy cuenta de que puedo estar confundiendo la idea de un "Conjunto" con la idea de una "Colección", no permitiendo y permitiendo duplicados, respectivamente. Tal vez esto es realmente solo una funcionalidad para la interfaz Set?

En el caso de que nadie sepa de alguna funcionalidad incorporada, quizás podríamos usar esto como un repositorio para la práctica estándar del código de operación de conjunto de Java? Me imagino que esta rueda ha sido reinventada en numerosas ocasiones.

Respuesta

101

La intersección se realiza con Collection.retainAll; resta con Collection.removeAll; unión con Collection.addAll. En cada caso, como Set actuará como un conjunto y List actuará como una lista.

Como objetos mutables, funcionan en su lugar. Tendrá que copiar explícitamente si desea retener el objeto mutable original sin cambiar.

7

¿Está buscando java.util.Set interfaz (y sus implementaciones HashSet y TreeSet (ordenados))?
La interfaz define removeAll (Collection c) que se parece a substract(), y retainAll (Collection c) que se parece a la intersección.

+0

mejor enlace (Java 6 docs): http: //java.sun. com/javase/6/docs/api/java/util/Set.html –

+2

Buena respuesta. Sin embargo, estos modificarán uno de los dos conjuntos. Si Ross quiere un tercer set que contenga la solución, necesitará clonar uno primero y usarlo como la variable implícita. –

+0

mmyer, gracias por señalar eso, todavía tengo una pestaña abierta en Java 1.5 documentos para jugar con Processing, y con demasiada frecuencia me muerden estos malditos conjuntos de marcos. El enlace es fijo. – PhiLho

15

Recomendaría Google Guava. La clase Sets parece tener exactamente lo que estás buscando. Tiene un método intersection y un método difference.

This presentation es probablemente algo que desea ver si está interesado. Se refiere a Google Collections, que era el nombre original de Guava.

5

Para operaciones mutables, ver respuesta aceptada.

Para una variante imutable se puede hacer esto con Java 8

resta

set1 
    .stream() 
    .filter(item-> !set2.contains(item)) 
    .collect(Collectors.toSet()) 

intersección

set1 
    .stream() 
    .filter(item-> set2.contains(item)) 
    .collect(Collectors.toSet()) 
Cuestiones relacionadas