嗨,此代码将返回indexoutofboundsException,我真的不知道为什么?我想删除那些与pointlist其中的对象相同的对象list.
public void listOfExternalPoints(List<Point> list) {
System.out.println(list.size());
System.out.println(pointList.size());
int n = pointList.size();
for (int i = pointList.size() - 1; i >= 0; i--) {
for (int j = 0; j < list.size(); j++) {
if (pointList.get(i)==(list.get(j))) {
pointList.remove(i);
n--;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
println的输出也将是:
54
62
Run Code Online (Sandbox Code Playgroud)
也是例外:
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 60, Size: 60
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at ConvexHull.BlindVersion.listOfExternalPoints(BlindVersion.java:83)
Run Code Online (Sandbox Code Playgroud)
谢谢.
sch*_*eld 10
嘿,你从列表中删除了一些元素.因此列表小于循环开始时的列表.
我建议你用:
pointList.removeAll(list)
Run Code Online (Sandbox Code Playgroud)
或者是迭代器.
当你这样做时pointList.remove(i),你应该脱离内循环.否则,它会尝试pointList.get(i)在循环的下一次迭代中再次索引你刚刚删除的索引,这就是为什么你得到了异常.
当arrayLists删除元素时,将取出该元素,并将其后的所有元素向下移动.因此,如果删除索引3并且只有4个元素,则新的arrayList只有3大小,并且您尝试获取索引3,这是超出范围的.
编辑:更好的方法是:
for(Point p : list) {
pointList.remove(p);
}
Run Code Online (Sandbox Code Playgroud)
它会有相同的效率,但我认为更正确.请记住,==比较同一对象的引用.remove方法使用.equals检查是否相等,这就是我想要的.
| 归档时间: |
|
| 查看次数: |
8858 次 |
| 最近记录: |