您好 我写了这部分代码。在for循环之前我有这个arraylist:
[X :49.0 Y: 113.0 , angle :0.0, X :141.0 Y: 106.0 , angle :0.0, X :110.0 Y: 185.0 , angle: 1.0768211289482128, X :99.0 Y: 139.0 , angle: 1.9961041242180873, X :103.0 Y: 126.0 , angle : 2.4208694638343324]
显示某些点的"x" and "y" and "angle"
。
但是在for循环中我想删除那些超过
X :110.0 Y: 185.0 , angle: 1.0768211289482128
但它为我打印这个数组:
[X :49.0 Y: 113.0angle0.0, X :141.0 Y: 106.0 , angle:0.0, X :110.0 Y: 185.0 , angle: 1.0768211289482128, X :103.0 Y: 126.0 , angle: 2.4208694638343324]
这是不正确的
int size = list .size();
for (int i=0;i<size;i++) {
if (list.get(i).getAngle() > pivot.getAngle() ) {
list.remove(i);
size--;
}
}
请帮帮我 感谢
答案 0 :(得分:6)
我建议您从list
获取Iterator
并使用iter.hasNext()
,iter.next()
和iter.remove()
,如下所示:
Iterator<Point> iter = list.iterator();
while (iter.hasNext())
if (iter.next().getAngle() > pivot.getAngle())
iter.remove();
另一种选择是将它们放在SortedMap
中,让角度代表键,并使用tailMap(pivot.getAngle())
来获得角度大于枢轴的那些点。
答案 1 :(得分:5)
每当你删除一个元素时,它会将以下元素的索引向下移动1.最简单的解决方法是反过来:
for (int i = list.size() - 1; i >= 0; i--) {
if (list.get(i).getAngle() > pivot.getAngle() ) {
list.remove(i);
}
}
答案 2 :(得分:4)
删除元素时,还应降低索引值(i
),否则它将跳过下一个值 - 因为值将会移位。例如,假设您最初拥有值{ a, b, c, d, e }
。在i==2
的迭代中,您将看到c
。如果您随后移除了c
,则{ a, b, d, e }
只剩下i
在for
语句的迭代部分中增加为3时,这意味着{{1} }}会返回list.get(i)
- 所以你永远不会看e
。
可以通过在d
块中添加i--;
语句来解决此问题...但更简单的方法是从最后开始向后工作:
if
或者,您可能需要考虑创建一个仅包含 要保留的元素的新列表:
for (int i = list.size() - 1; i >= 0; i--) {
if (list.get(i).getAngle() > pivot.getAngle()) {
list.remove(i);
}
}