这是不能正常工作的家庭作业的一部分。我得到了这类使用对象:
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.提前感谢您提供的任何帮助。
答案 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-