5

我有两个数组列表。每个都有 Employee 类型的对象列表。

Employee 类如下所示

    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

}

我需要根据员工对象的属性(即员工 ID)来查找两个列表之间的差异。

员工 ID 是手动生成的给每个员工的唯一 ID。

    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



    }

}
4

4 回答 4

7

仅在检查相等性时才使用类的重写equals()hashcode()方法(我不确定为什么需要该字段。您也可以合并它)。NetBeans / Eclipse IDE 可以为您做到这一点。然后,您可以创建原始列表的副本并用于计算差异。EmployeeemployeeIdidList.removeAll()

于 2012-06-29T11:19:37.960 回答
0

你的列表不是真正的列表,是吗?他们实际上是一组没有明确顺序的员工。如果它们具有定义的顺序,它们将更容易比较。为employeeId 定义一个Comparator 并使用Collections.sort 对两个数组进行排序。然后,您需要应用差异算法。我没有看到任何好的通用的。您可以将排序列表转换为 XML,然后使用XMLUnit 的 Diff 类来获取差异。您可以将其呈现为字符串列表并应用文本 diff。如果您想实现一个特定于您的用例的算法,这里是关于差异算法的讨论。

于 2012-06-29T11:20:53.720 回答
0

在列表中使用 removeAll 方法:

list1.removeAll(list2);

此方法将删除 list1 和 list2 中的所有常见元素,因此在调用此方法后 list1 包含以下员工 ID,因为这些在 list2 EMP03 EMP04 EMP05 中是唯一的

并覆盖Employee类中的equals方法

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

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

    }
于 2012-06-29T11:27:06.210 回答
0

而是将两个员工列表放入地图中。关键是employeeId。价值就是employee对象。然后removeAll按照@AndrewButenko 的建议使用。您应该使用地图进行比列表更有效的查找。(删除涉及查找。)我会推荐 set,但是你需要实现equalsand hashcode。它们已经为 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();

如果您关心结果的顺序,您可以在最后对集合进行排序或使用TreeMap

于 2012-06-29T11:27:44.523 回答