2012-06-29 11 views
5

Ho due liste di array. Ciascuno ha una lista di oggetti di tipo Employee.Come trovare le differenze tra due liste di array in base a una proprietà?

La classe Employee si presenta come di seguito

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 

} 

Ho bisogno di trovare le differenze tra le due liste sulla base di una proprietà dell'oggetto dipendente che è dipendente id.

L'id del dipendente viene generato manualmente, un ID univoco assegnato a ciascun dipendente.

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

Cosa succede se i tuoi oggetti non sono coerenti? Ad esempio, se la lista1 contiene ("F1", "L1", "EMPO1") e la lista 2 contiene ("F11", "L11", "EMP01"). Verrà restituito come non in un'altra lista, anche se la chiave è la stessa? –

+0

@Disco 3. Stiamo solo cercando un ID dipendente diverso. Nel tuo caso sarebbero visti come gli stessi. – ashishjmeshram

+0

La classe Employee dovrà implementare Comparable –

risposta

6

Override equals() e hashcode() metodi della classe Employee usare solo employeeId durante il controllo per l'uguaglianza (im non sicuro circa il motivo per cui è necessario il campo id. Si potrebbe quello di incorporare esso pure). Gli IDE di NetBeans/Eclipse possono farlo per te. Quindi è possibile creare una copia degli elenchi originali e utilizzare List.removeAll() per calcolare la differenza.

0

Le tue liste non sono veramente liste, vero? Sono davvero gruppi di dipendenti senza un ordine definito. Saranno più facili da confrontare se hanno un ordine definito. Definire un comparatore per employeeId e utilizzare Collections.sort per ordinare i due array. Quindi è necessario applicare un algoritmo di differenza. Non vedo nessun generico buono. È possibile trasformare la lista ordinata in XML e quindi utilizzare XMLUnit's Diff class per ottenere le differenze. Puoi renderlo come un elenco di stringhe e applicare uno textual diff. Ecco uno discussion sugli algoritmi di differenza se si desidera implementarne uno specifico per il proprio caso d'uso.

+0

Non c'è nulla della collezione framewrok che farà ciò mentre altri stanno dicendo di usare equalsTo ed ecc. – ashishjmeshram

+0

Questa risposta è eccessiva per il tuo caso d'uso. Sto scrivendo un altro. –

0

utilizzare il metodo removeAll sulle liste:

list1.removeAll(list2); 

Questo metodo rimuoverà i tutti gli elementi comuni in lista1 e lista2, così dopo aver chiamato questo metodo lista1 contiene sotto gli ID dei dipendenti in quanto questi sono unici da lista2 EMP03 EMP04 EMP05

e sovrascrivere il metodo equals in Employee Classe

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

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

    } 
0

Inserisci invece entrambe le liste di dipendenti in mappe. La chiave è employeeId. Il valore è l'oggetto employee. Quindi utilizzare removeAll come suggerito da @AndrewButenko. Dovresti utilizzare le mappe per ricerche più efficienti rispetto agli elenchi. (La rimozione riguarda la ricerca). Vorrei raccomandare il set, ma poi avresti bisogno di implementare equals e hashcode. Sono già implementati per 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(); 

Se vi preoccupate per l'ordine dei risultati, è possibile ordinare la raccolta alla fine o utilizzare TreeMap posto.

Problemi correlati