我有两个列表,例如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中可能没有元素,但是必须检查条件。
答案 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中删除,并仅打印p
和q
,
[p, q]
编辑:这是Employee
类的示例代码,尽管您的类可能与众不同,但是正如您所说的,密钥是employeeId
,因此需要equals
和hashCode
方法只能在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);
}
尝试使用此代码,查看其打印内容,然后仅注释equals
和hashCode
方法,然后查看会发生什么。注释完这两个方法后,由于列表不知道两个对象何时相等,因此不会删除list1中存在的对象。
答案 1 :(得分:0)
简单的人怎么了
List<Employee> employeeList1
List<Employee> employeeList2
for (Employee employee : employeeList2) {
if (employeeList1.contains(employee)) {
employeeList2.remove(employee)
}
}
当然,如果使用多个线程,则必须同步List调用。
答案 2 :(得分:0)
答案 3 :(得分:0)
employeeList1 // data present
employeeList2 // data present
List<Employee> newList = new ArrayList<Empolyee>();
newList.add(employeeList2 );
newList.retainAll(employeeList1);
newList将不包含employeeList1数据。