在for循环中从数组中删除项目会返回错误

时间:2018-07-12 12:46:20

标签: java arrays

我正在尝试在arraylist中找到第一个和最新的对象。这些对象直接映射到mongo文档。

我可以通过检查_parentid字段来轻松找到第一个对象,该字段应该为null,已完成,可以正常工作。

尽管最新的对象有点棘手,因为它涉及对时间戳(长)进行排序并返回最新的对象。

我拥有的代码实际上正在完成工作-已由控制台日志证明,但是,在for循环的最后一步时出现错误。

  

java.util.ConcurrentModificationException

这是我的代码;

    public String aggregateRecords(List <VehicleRegistration> records) {

    VehicleRegistration parent;
    VehicleRegistration latest;

    //Parent = record without a parent id
    for (Iterator<VehicleRegistration> iterator = records.iterator(); iterator.hasNext(); ) {
        VehicleRegistration record = iterator.next(); <---errors here
        if (record._parentid == null) {
            parent = record;
            System.out.println("parent="+parent);
            iterator.remove();
        }
        //find latest child by timestamp
        else {
            records.sort(new Comparator<VehicleRegistration>() {
                @Override
                public int compare(VehicleRegistration v1, VehicleRegistration v2) {
                    return v1.timestamp.compareTo(v2.timestamp);
                }
            });
            Collections.reverse(records);
            System.out.println("sorted list="+records);
            latest = records.get(0);
            System.out.println("latest record="+latest);
        }
    }

    //todo - merge together and return
    return "this will be the aggregated record";
}

1 个答案:

答案 0 :(得分:2)

正在对集合进行排序,同时对其进行迭代。

else块在以下几行上修改列表:

records.sort(new Comparator<VehicleRegistration>() {
    @Override
    public int compare(VehicleRegistration v1, VehicleRegistration v2) {
        return v1.timestamp.compareTo(v2.timestamp);
    }
});
Collections.reverse(records);

这会对列表进行两次排序,并在下次调用iterator.next()

时触发ConcurrentModificationException