如何通过比较两个列表从一个列表中删除元素

时间:2019-04-22 11:06:40

标签: java list arraylist

我有两个列表,例如List1和List2。 如果列表1中已经存在元素,我需要从列表2中删除元素

为了避免ConCurrentModificationException,我尝试使用ListIterator

employeeList1 // data present
employeeList2 // data present
ListIterator<Employee> zeroList=employeeList2.listIterator();

//remove employee if already present in list1
while(zeroList.hasNext()){
for(Employee employee : employeeList1){
                    if(zeroList.next().getID().equals(employee.getId())){
zeroList.remove();
                    }
                }
            }

我在if条件中遇到了以下异常

java.util.NoSuchElementException

List1中可能没有元素,但是必须检查条件。

4 个答案:

答案 0 :(得分:2)

您可以在要删除其元素的集合上使用removeAll方法,并将该集合作为包含要删除的元素的参数传递。

List<String> list1 = new ArrayList<>();
list1.add("a");
list1.add("b");
list1.add("c");
List<String> list2 = new ArrayList<>();
list2.add("a");
list2.add("p");
list2.add("q");
list2.removeAll(list1);
System.out.println(list2);

将list2中的a从list2中删除,并仅打印pq

[p, q]

编辑:这是Employee类的示例代码,尽管您的类可能与众不同,但是正如您所说的,密钥是employeeId,因此需要equalshashCode方法只能在employeeId上玩。

static class Employee {
    private long employeeId;
    private String name;
    // whatever more variables

    public Employee(long employeeId, String name) {
        this.employeeId = employeeId;
        this.name = name;
    }

    public String toString() {
        return String.format("Employee[employeeId=%s, name=%s]", employeeId, name);
    }

    @Override
    public boolean equals(Object o) {
        if (o instanceof Employee) {
            return this.employeeId == ((Employee) o).employeeId;
        }
        return false;
    }

    @Override
    public int hashCode() {
        return new Long(employeeId).hashCode();
    }
}

public static void main(String[] args) throws Exception {
    List<Employee> list1 = new ArrayList<>();
    list1.add(new Employee(1, "a"));
    list1.add(new Employee(2, "b"));
    list1.add(new Employee(3, "c"));
    List<Employee> list2 = new ArrayList<>();
    list2.add(new Employee(1, "a"));
    list2.add(new Employee(4, "d"));
    list2.add(new Employee(5, "e"));
    list2.removeAll(list1);
    System.out.println(list2);
}

尝试使用此代码,查看其打印内容,然后仅注释equalshashCode方法,然后查看会发生什么。注释完这两个方法后,由于列表不知道两个对象何时相等,因此不会删除list1中存在的对象。

答案 1 :(得分:0)

简单的人怎么了

List<Employee> employeeList1
List<Employee> employeeList2

for (Employee employee : employeeList2) {
   if (employeeList1.contains(employee)) {
      employeeList2.remove(employee)
   }
}

当然,如果使用多个线程,则必须同步List调用。

答案 2 :(得分:0)

您可以使用 Apache commons-collections

图书馆:

List<String> newList = ListUtils.union(list1, list2);

答案 3 :(得分:0)

employeeList1 // data present
employeeList2 // data present
List<Employee> newList = new ArrayList<Empolyee>();
newList.add(employeeList2 );
newList.retainAll(employeeList1);

newList将不包含employeeList1数据。