从arrayList中删除特殊元素

时间:2010-11-22 07:33:54

标签: java arraylist

您好 我写了这部分代码。在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--;

        }
    }

请帮帮我 感谢

3 个答案:

答案 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 }只剩下ifor语句的迭代部分中增加为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);
    }
}