循环遍历ArrayList,检查条件,删除一个或多个项

时间:2016-09-16 02:19:33

标签: java arraylist

这是不能正常工作的家庭作业的一部分。我得到了这类使用对象:

private static class Segment {
    int start, end;

    Segment(int start, int end) {
        this.start = start;
        this.end = end;
    }
}

因此,正如您所看到的,一个段有一个开始和一个结束。把它想象成一段时间。我想循环遍历Segments的ArrayList,如果整数落在该段(包括该段)内,则该段将从列表中删除。这是我的循环:

for (int i=0; i < segmentList.size(); ++i) {
    if (segmentList.get(i).start <= minEnd && minEnd <= segmentList.get(i).end) {
        segmentList.remove(segmentList.get(i));
    }
}

我遇到的问题是它没有删除所有细分。采取以下部分:

4,7
1,3
2,5
5,6

另一种方法是查看段的末尾并选择最小的段。它正确地表示minEnd是3,它删除了1,3段,但是留下了2,5 。正确的输出应该是第一次通过时删除1,3和2,5。接下来通过minEnd将是6.提前感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

已经在注释中给出,在使用索引进行迭代时,删除元素会缩小列表,因此您将无法获得所需的结果。

您可以使用迭代器从列表中删除元素

    Iterator<Segment> it = segmentList.iterator();
    while (it.hasNext()) {
        Segment seg = it.next();
        if (seg.start <= minEnd && minEnd <= seg.end) {
            it.remove();
        }
    }

输出

[Segment:: start 4 end 7, Segment:: start 5 end 6]

Java-8流

    List<Segment> segments = segmentList.stream().filter(seg -> seg.start <= minEnd && minEnd <= seg.end).collect(Collectors.toList());

输出

[Segment:: start 4 end 7, Segment:: start 5 end 6]

答案 1 :(得分:0)

由于您在修改集合时更改了集合的大小,因此您的代码无法正常工作,这不好,因为在运行时将代码暴露给与尝试超出列表中的范围相关的异常。

要走的路可以是:

使用时间列表,将要删除的元素添加到其中,然后在搜索结束时删除原始列表中的引用。

列表#removeAll(...)将执行此操作。

https://docs.oracle.com/javase/8/docs/api/java/util/List.html#removeAll-java.util.Collection-