首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IndexOutOfBoundsException

IndexOutOfBoundsException
EN

Stack Overflow用户
提问于 2010-11-25 00:35:59
回答 7查看 9.2K关注 0票数 2

嗨,这段代码将返回indexoutofboundsException,我真的不知道为什么?我想从pointlist中删除那些与list中的对象相同的对象。

代码语言:javascript
复制
    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--;
            }
        }
    }

}

println的输出也是:

代码语言:javascript
复制
54
62

还有一个例外:

代码语言:javascript
复制
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)

谢谢。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-11-25 00:40:11

嘿,你从列表中删除了一些元素。因此,该列表比循环开始时要小。

我建议你使用:

代码语言:javascript
复制
pointList.removeAll(list)

或者是迭代器。

票数 10
EN

Stack Overflow用户

发布于 2010-11-25 00:39:18

当你做pointList.remove(i)的时候,你应该从内部循环中中断。否则,它将在下一次循环迭代时再次尝试索引您刚刚删除的pointList.get(i),这就是为什么您会得到异常。

当arrayLists删除元素时,该元素将被取出,并且它之后的所有元素都将被下移。因此,如果删除索引3并且只有4个元素,那么新的arrayList只有3个大小,而您试图获得索引3,这是越界的。

编辑:更好的方法是:

代码语言:javascript
复制
for(Point p : list) {
    pointList.remove(p);
}

它将具有相同的效率,但我认为更正确。请记住,==会比较同一对象的引用。其中,因为remove方法使用.equals来检查是否相等,这就是我假设您想要的。

票数 6
EN

Stack Overflow用户

发布于 2010-11-25 00:39:08

pointList.remove(i);

这将减小您的pointList大小。希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4269153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档