2012-06-29 14 views
5

Tengo dos lista de matrices. Cada uno tiene una lista de Objetos de tipo Empleado.¿Cómo encontrar las diferencias entre dos Listas de Matriz basadas en una propiedad?

clase El empleado se parece a continuación

public class Employee { 

    Employee(String firstname, String lastname, String employeeId) { 
     this.firstname = firstname; 
     this.lastname = lastname; 
     this.employeeId = employeeId; 
    } 

    private int id; // this is the primary key from employee table 

    private String firstname; 

    private String lastname; 

    private String employeeId; // manually assigned unique id to each employee 

    // getters and setters 

} 

Tengo que encontrar las diferencias entre las dos listas basadas en una propiedad del objeto que es empleado Identificación del empleado.

ID de empleado es una identificación única generada manualmente que se le asigna a cada empleado.

import java.util.ArrayList; 
import java.util.List; 


public class FindDifferences { 

    public static void main(String args[]){ 
     List<Employee> list1 = new ArrayList<Employee>(); 
     List<Employee> list2 = new ArrayList<Employee>(); 

     list1.add(new Employee("F1", "L1", "EMP01")); 
     list1.add(new Employee("F2", "L2", "EMP02")); 
     list1.add(new Employee("F3", "L3", "EMP03")); 
     list1.add(new Employee("F4", "L4", "EMP04")); 
     list1.add(new Employee("F5", "L5", "EMP05")); 

     list2.add(new Employee("F1", "L1", "EMP01")); 
     list2.add(new Employee("F2", "L2", "EMP02")); 
     list2.add(new Employee("F6", "L6", "EMP06")); 
     list2.add(new Employee("F7", "L7", "EMP07")); 
     list2.add(new Employee("F8", "L8", "EMP08")); 

     List<Employee> notPresentInList1 = new ArrayList<Employee>(); 
     // this list should contain EMP06, EMP07 and EMP08 

     List<Employee> notPresentInList2= new ArrayList<Employee>(); 
     // this list should contain EMP03, EMP04 and EMP05 



    } 

} 
+0

¿Qué sucede si sus objetos no son consistentes? Por ejemplo, si list1 contiene ("F1", "L1", "EMPO1") y list2 contiene ("F11", "L11", "EMP01"). ¿Se devolvería eso como no en la otra lista, aunque la clave sea la misma? –

+0

@Disco 3. Solo buscamos una identificación de empleado diferente. En su caso, serían vistos como lo mismo. – ashishjmeshram

+0

Su clase Empleado tendrá que implementar Comparable –

Respuesta

6

Anulación equals() y hashcode() métodos de la clase Employee a utilizar sólo employeeId en la comprobación de la igualdad (no estoy seguro de por qué es necesario el campo id. Es posible que lo incorporarlo también). Los IDE de NetBeans/Eclipse pueden hacer esto por usted. Luego puede crear una copia de sus listas originales y usar List.removeAll() para calcular la diferencia.

0

Sus listas no son realmente listas, ¿verdad? En realidad, son grupos de empleados sin un orden definido. Serán más fáciles de comparar si tienen un orden definido. Defina un Comparador para employeeId y use Collections.sort para ordenar las dos matrices. Entonces necesitas aplicar un algoritmo de diferencia. No veo ningún genérico bueno. Puede convertir su lista ordenada en XML y luego usar XMLUnit's Diff class para obtener diferencias. Puede representarlo como una lista de cadenas y aplicar un textual diff. Aquí hay un discussion en algoritmos de diferencia si desea implementar uno específico para su caso de uso.

+0

¿No hay nada en la colección framewrok en sí mismo que hará esto ya que otros dicen usar equalsTo y etc. – ashishjmeshram

+0

Esta respuesta es exagerada para su caso de uso. Estoy escribiendo uno diferente. –

0

utilizar el método de removeAll en las listas:

list1.removeAll(list2); 

Este método será eliminar todos los elementos comunes de list1 y list2, Así que después de llamar a este método lista1 contiene continuación identificadores de los empleados ya que son únicos de lista2 EMP03 EMP04 EMP05

y anular el método equals en clase Empleado

 @Override 
    public boolean equals(Object obj) { 
     Employee employee = (Employee)obj; 

     if (this.employeeId.equalsIgnoreCase(employee.employeeId)){ 
      return true; 
     } 
     return false; 

    } 
0

Ponga ambas listas de empleados en mapas en su lugar. La clave es employeeId. El valor es el objeto employee. Luego use removeAll como sugirió @AndrewButenko. Debe usar mapas para realizar búsquedas más eficientes que las listas. (La eliminación implica la búsqueda.) Recomendaría establecer, pero luego tendría que implementar equals y hashcode. Ya están implementados para String.

Map<String, Employee> map1 = new HashMap<String, Employee>(); 
for (Employee e : list1) { 
    map1.put(e.getEmployeeId(), e); 
} 
Map<String, Employee> map2 = new HashMap<String, Employee>(); 
for (Employee e : list2) { 
    map2.put(e.getEmployeeId(), e); 
} 

// clone makes sure we don't mess with the original map2 because we will reuse it 
Collection<Employee> notPresentInList1 = map2.clone().removeAll(map1).values(); 

Collection<Employee> notPresentInList2 = map1.removeAll(map2).values(); 

Si usted se preocupa por el orden de los resultados, puede ordenar la recogida al final o utilizar TreeMap lugar.

Cuestiones relacionadas