una simetrica programar manejo listas intersección interseccion entre diferencia conjuntos complemento comparar arreglos java

simetrica - Lista de interseccion en java



union de listas en java (7)

Tengo dos ArrayList<Integer> siguiente manera:

original: 12, 16, 17, 19, 101

seleccionado: 16, 19, 107, 108, 109

Quiero hacer una intersección / unión en estas listas de modo que al final tenga dos listas:

Añadir: 108,109,107

eliminar: 12, 17, 101

La longitud de las listas originales y seleccionadas varía y una puede ser mayor / menor que la otra


Como alternativa, puede usar CollectionUtils de la biblioteca de Apache commons. Tiene métodos de intersección estática, unión y resta adecuados para su caso.


Hay una nueva biblioteca disponible en underscore-java . Se puede hacer la diferencia y la intersección de listas y matrices. Ejemplo vivo.

Ejemplo de código:

List<Integer> original = Arrays.asList(12, 16, 17, 19, 101); List<Integer> selected = Arrays.asList(16, 19, 107, 108, 109); List<Integer> add = U.difference(selected, U.intersection(original, selected)); List<Integer> remove = U.difference(original, selected);


Intersección: original.retainAll(selected) .

Después ese original contendrá solo elementos presentes en ambas colecciones. Devuelve true si algo ha cambiado.

ADVERTENCIA : Este método es muy lento para grandes colecciones.


Para las operaciones de intersección y unión, el tipo de colección natural es un Conjunto en lugar de una Lista, también es más eficiente de usar.


Usando la biblioteca de guayaba:

List<Integer> listA = Lists.newArrayList(12,16,17,19,101); List<Integer> listB = Lists.newArrayList(16,19,107,108,109); Set<Integer> intersection = Sets.intersection(Sets.newHashSet(listA), Sets.newHashSet(listB)); listA.removeAll(intersection); listB.removeAll(intersection);


List<Integer> original; List<Integer> selected; List<Integer> add = new ArrayList<Integer>(selected); add.removeAll(original); List<Integer> remove = new ArrayList<Integer>(original); remove.removeAll(selected);

Tenga cuidado con los casos de borde alrededor de elementos duplicados. ¿Debe respetarse la cardinalidad? Como en, si tuviera 5, 6 originalmente y 5, 5, 6 después, ¿debería agregar 5 ? Lo anterior funciona mejor con los Set s, ya que no tienen duplicados (más las búsquedas que contains() son más rápidas ya que están indexadas por los datos que contienen).


List<Integer> original = Arrays.asList(12,16,17,19,101); List<Integer> selected = Arrays.asList(16,19,107,108,109); ArrayList<Integer> add = new ArrayList<Integer>(selected); add.removeAll(original); System.out.println("Add: " + add); ArrayList<Integer> remove = new ArrayList<Integer>(original); remove.removeAll(selected); System.out.println("Remove: " + remove);

Salida:

Add: [107, 108, 109] Remove: [12, 17, 101]

Utiliza el método removeAll de la colección. Ver javadocs.