2012-06-29 16 views
5

Mam dwie listy tablic. Każdy ma listę obiektów typu Pracownik.Jak znaleźć różnice między dwiema listami szyku na podstawie właściwości?

klasa Pracownik wygląda poniżej

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 

} 

muszę znaleźć różnice między tymi dwoma listami w oparciu o właściwości obiektu pracownika, który jest identyfikator pracownika.

Identyfikator pracownika to wygenerowany ręcznie niepowtarzalny identyfikator nadany każdemu pracownikowi.

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

Co się stanie, jeśli obiekty nie są spójne? Na przykład, jeśli lista1 zawiera ("F1", "L1", "EMPO1"), a lista2 zawiera ("F11", "L11", "EMP01"). Czy zostanie zwrócone, jak nie na drugiej liście, mimo że klucz jest taki sam? –

+0

@Disco 3. Szukamy tylko innego identyfikatora pracownika. W twoim przypadku będą one postrzegane jako takie same. – ashishjmeshram

+0

Twoja klasa pracowników będzie musiała zaimplementować Porównywalne –

Odpowiedz

6

Zastąp equals() i hashcode() metody klasy Employee używać tylko employeeId podczas sprawdzania równości (nie jestem pewien, dlaczego trzeba boiska id. Państwo może co do włączenia go również). Identyfikatory środowiska NetBeans/Eclipse mogą to dla ciebie zrobić. Następnie możesz utworzyć kopię oryginalnych list i użyć List.removeAll() do obliczenia różnicy.

0

Twoje listy nie są prawdziwie listami, prawda? Są to naprawdę zestawy pracowników bez określonego porządku. Łatwiej je porównać, jeśli mają zdefiniowane zamówienie. Zdefiniuj Komparator dla employeeId i użyj Collections.sort do sortowania dwóch tablic. Następnie musisz zastosować algorytm różnicowy. Nie widzę żadnych dobrych ogólnych. Możesz zmienić posortowaną listę w XML, a następnie użyć XMLUnit's Diff class, aby uzyskać różnice. Można go renderować jako listę ciągów znaków i zastosować textual diff. Oto discussion algorytmy różnicowe, jeśli chcesz zaimplementować jeden konkretny przypadek użycia.

+0

Czy nie ma czegoś, co sama kolekcja framewrok, która zrobi to, jak inni mówią, aby użyć equalsTo i itp. – ashishjmeshram

+0

Ta odpowiedź jest przesadna w przypadku użycia. Piszę inny. –

0

Użyj metoda removeAll na listach:

list1.removeAll(list2); 

Metoda ta usunie wszystkie wspólne elementy w listy1 i listy2, więc po wywołaniu tej metody lista1 zawiera poniżej identyfikatory pracownicze, ponieważ są one unikatowe z lista2 EMP03 EMP04 EMP05

I zastąpić metodę równi w Pracownikiem klasy

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

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

    } 
0

Zamiast tego umieść obie listy pracowników w mapach. Kluczem jest employeeId. Wartością jest obiekt employee. Następnie użyj removeAll jako @AndrewButenko zasugerował. Powinieneś używać map do bardziej wydajnych wyszukiwań niż listy. (Usunięcie wiąże się z wyszukiwaniem). Polecam ustawić, ale wtedy musisz zaimplementować equals i hashcode. Są już zaimplementowane dla 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(); 

Jeśli dbasz o kolejności wyników, można sortować kolekcję na końcu lub użyć TreeMap zamiast.

Powiązane problemy