2012-06-29 35 views
5

Tôi có hai danh sách mảng. Mỗi danh sách có các đối tượng kiểu nhân viên.Làm thế nào để tìm sự khác biệt giữa hai Danh sách Mảng dựa trên một tài sản?

lớp Các nhân viên trông giống như dưới đây

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 

} 

Tôi cần phải tìm sự khác biệt giữa hai danh sách dựa trên một thuộc tính của đối tượng nhân viên đó là id của nhân viên.

Id nhân viên là id duy nhất được tạo thủ công cho mỗi nhân viên.

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

Điều gì xảy ra nếu đối tượng của bạn không nhất quán? Ví dụ, nếu list1 chứa ("F1", "L1", "EMPO1") và list2 chứa ("F11", "L11", "EMP01"). Điều đó có được trả lại như không có trong danh sách khác, mặc dù khóa là như nhau? –

+0

@Disco 3. Chúng tôi chỉ tìm kiếm id nhân viên khác nhau. Trong trường hợp của bạn, họ sẽ được xem như nhau. – ashishjmeshram

+0

Lớp nhân viên của bạn sẽ cần phải thực hiện Comparable –

Trả lời

6

Override equals()hashcode() phương pháp của lớp Employee của bạn để chỉ sử dụng employeeId khi kiểm tra đẳng thức (im không chắc chắn về lý do tại sao bạn cần lĩnh vực id. Bạn có thể những gì để kết hợp nó là tốt). NetBeans/Eclipse IDE có thể làm điều này cho bạn. Sau đó, bạn có thể tạo một bản sao của danh sách ban đầu và sử dụng List.removeAll() để tính chênh lệch.

0

Danh sách của bạn không thực sự là danh sách, đúng không? Họ thực sự là bộ nhân viên không có thứ tự xác định. Họ sẽ dễ dàng so sánh hơn nếu họ có thứ tự xác định. Xác định một Comparator cho employeeId và sử dụng Collections.sort để sắp xếp hai mảng. Sau đó, bạn cần phải áp dụng một thuật toán khác biệt. Tôi không thấy bất kỳ cái nào tốt. Bạn có thể biến danh sách được sắp xếp của bạn thành XML và sau đó sử dụng XMLUnit's Diff class để có được sự khác biệt. Bạn có thể hiển thị nó dưới dạng danh sách các chuỗi và áp dụng một số textual diff. Dưới đây là discussion về các thuật toán khác biệt nếu bạn muốn triển khai một thuật toán cụ thể cho trường hợp sử dụng của mình.

+0

Isnt có bất cứ điều gì bộ sưu tập framewrok chính nó sẽ làm điều này như khác đang nói để sử dụng equalsTo và vv – ashishjmeshram

+0

Câu trả lời này là quá mức cần thiết cho trường hợp sử dụng của bạn. Tôi đang viết một cái khác. –

0

Sử dụng phương pháp RemoveAll trên danh sách:

list1.removeAll(list2); 

Phương pháp này sẽ loại bỏ tất cả các yếu tố chung trong list1 và List2, Vì vậy, sau khi gọi phương pháp list1 này chứa bên dưới id nhân viên vì đây là những độc đáo từ List2 EMP03 EMP04 EMP05

Và ghi đè bằng phương pháp trong nhân viên Lớp

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

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

    } 
0

Đặt cả hai danh sách nhân viên vào bản đồ để thay thế. Khóa là employeeId. Giá trị là đối tượng employee. Sau đó, hãy sử dụng removeAll như @AndrewButenko đề xuất. Bạn nên sử dụng bản đồ để tra cứu hiệu quả hơn danh sách. (Loại bỏ liên quan đến tra cứu.) Tôi sẽ khuyên bạn nên thiết lập, nhưng sau đó bạn sẽ cần phải thực hiện equalshashcode. Chúng đã được triển khai cho 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(); 

Nếu bạn quan tâm đến thứ tự của kết quả, bạn có thể sắp xếp bộ sưu tập ở cuối hoặc sử dụng TreeMap thay thế.

Các vấn đề liên quan