2011-05-17 18 views
8

¿Cómo puedo saber el elemento diferente entre 2 listas de arreglos en Java? Necesito el elemento exacto, no un valor booleano que se puede recuperar usando removeAll().Encontrar los diferentes elementos entre dos ArrayLists en Java

+5

Tenga en cuenta que '' removeAll() ** ** cambios de la lista en la que' volver a llamar al método. Entonces, si devuelve 'verdadero', significa que la lista ha sido modificada. Entonces el método no es completamente inútil o algo así. – BalusC

Respuesta

1
LinkedHashMap table; 
for each element e of array A 
    if table.get(e) != null 
     table.put(e, table.get(e) + 1) 
    else 
     table.put(e, 0) 

//Do the same for array B 
for each element e of array B 
    if table.get(e) != null 
     table.put(e, table.get(e) + 1) 
    else 
     table.put(e, 0) 

Al final de los bucles for, los elementos en la tabla con valor = 0 son los diferentes.

+0

oooo mucho mejor que la mía – hvgotcodes

+0

@hvgotcodes gracias. – Enrique

+0

no, gracias, aprendí algo ... – hvgotcodes

10

Si he entendido bien su pregunta a continuación, siguiendo el método nonOverLap en el siguiente código debe conseguirle que:

<T> Collection<T> union(Collection<T> coll1, Collection<T> coll2) { 
    Set<T> union = new HashSet<>(coll1); 
    union.addAll(new HashSet<>(coll2)); 
    return union; 
} 

<T> Collection<T> intersect(Collection<T> coll1, Collection<T> coll2) { 
    Set<T> intersection = new HashSet<>(coll1); 
    intersection.retainAll(new HashSet<>(coll2)); 
    return intersection; 
} 

<T> Collection<T> nonOverLap(Collection<T> coll1, Collection<T> coll2) { 
    Collection<T> result = union(coll1, coll2); 
    result.removeAll(intersect(coll1, coll2)); 
    return result; 
} 
2
import java.util.ArrayList; 
import java.util.Collection; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 

public class CompareTwoList { 
    public CompareTwoList() { 
     // TODO Auto-generated constructor stub 
    } 

    public static void main(String[] args) { 
     List<String> ls1 = new ArrayList<String>(); 
     ls1.add("a"); 
     ls1.add("b"); 
     ls1.add("c"); 
     ls1.add("d"); 

     List<String> ls2 = new ArrayList<String>(); 
     ls2.add("a"); 
     ls2.add("b"); 
     ls2.add("c"); 
     ls2.add("d"); 
     ls2.add("e"); 

     Set<String> set1 = new HashSet<String>(); 
     set1.addAll(ls1); 

     Set<String> set2 = new HashSet<String>(); 
     set2.addAll(ls2); 
     set2.removeAll(set1); 

     //set.addAll(ls1); 
     //set.addAll(ls1); 

     for (String diffElement : set2) { 
      System.out.println(diffElement.toString()); 
     } 
    } 
}  
+0

Perfecto y simplificado, funciona en todos los casos. Gracias –

9

Uso Apache Commons Collections (javadoc):

CollectionUtils.disjunction(a, b); 

Ver también: Java efectivo, 2da edición, Artículo 47: Conozca y use las bibliotecas (El autor menciona solo las bibliotecas integradas del JDK, pero creo que el razonamiento podría ser cierto para otras bibliotecas también).

0

Llame al método ReturnArrayListDiffElements pasando dos listas de matrices. Se devolverá una lista de arreglos que es la diferencia entre dos listas de matrices pasadas

public ArrayList ReturnArrayListDiffElements(ArrayList arrList1, ArrayList arrList2){ 
    ArrayList<String> List1 = new ArrayList<String>(); 
    ArrayList<String> List2 = new ArrayList<String>(); 
    ArrayList<String> List3 = new ArrayList<String>(); 
    ArrayList<String> List4 = new ArrayList<String>(); 

    List1.addAll(arrList1);  
    List2.addAll(arrList2); 

    List3 = ReturnArrayListCommonElements(List1,List2); 

    List1.removeAll(List3);  
    List2.removeAll(List3);  
    if(List1.size() > 0){ 
     List4.add("Distinct elements in Array List 1");  
     List4.addAll(List1);  
    } 
    if(List2.size() > 0){  
     List4.add("Distinct elements in Array List 2"); 
     List4.addAll(List2);  
    } 

    return List4; 
} 

public ArrayList ReturnArrayListCommonElements(ArrayList arrList1, ArrayList arrList2){  
    ArrayList<String> List1 = new ArrayList<String>(); 
    ArrayList<String> List2 = new ArrayList<String>(); 
    ArrayList<String> List1A = new ArrayList<String>();  
    ArrayList<String> List2A = new ArrayList<String>();  
    ArrayList<String> List1B = new ArrayList<String>();  
    ArrayList<String> List3 = new ArrayList<String>(); 

    List1.addAll(arrList1);  
    List2.addAll(arrList2);   
    List1A.addAll(arrList1);  
    List2A.addAll(arrList2);  
    List1B.addAll(arrList1); 

    int intList1Size, intList2Size;  
    List1.removeAll(List2); 
    intList1Size = List1.size(); 

    List2.removeAll(List1A);  
    intList2Size = List2.size(); 

    if (intList1Size == 0 && intList2Size ==0) {   
     List3.addAll(List1B);  
     return List3; 
    } else { 
     List3.addAll(List1B);  
     List1B.removeAll(List2A);  
     List3.removeAll(List1B);   
     return List3; 
    } 
} 
2

Depende de lo que desee verificar.

  1. Si desea obtener todos los elementos únicos para ambas listas (es decir, suma de todos los elementos que son únicos para la primera lista y todos los elementos que únicas para la segunda lista) también conocidos como symmetric difference que pueda utilizar como se mencionó anteriormente disyunción método de Apache Commons Collections 4.0:

    CollectionUtils.disjunction(a, b); 
    
  2. Si desea obtener todos los elementos únicos de una lista única (es decir, elementos que existen sólo en una lista, pero que no existen en el otro) als O conocido como relative complement puede restar de esta lista el otro usando restar método de Apache Commons Collections 4.0:

    CollectionUtils.subtract(a, b); //gives all unique elements of a that don't exist in b 
    
Cuestiones relacionadas