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.