从ArrayList中删除元素 - 代码正在跳过元素

时间:2011-04-28 01:11:41

标签: java arrays iterator

我想要做的是遍历一个引用某个段落的索引列表。如果段落太短,请从列表中删除索引。

这是我目前正在使用的代码,在谷歌搜索后,我试图接受使用迭代器的建议,但仍然没有运气。

    ArrayList<Content> list = anotherList;

    Iterator<Content> i = list.iterator();
    while (i.hasNext()) {

        Content element = i.next();
        int index = list.indexOf(element);

        String paragraph = getContent(index);

        if (paragraph.split(" ").length < minWordCount) {
            i.remove();
        } else {
            irrelevantFuction(index);
        }
    }

如果调用i.remove(),迭代器似乎仍然跳过元素,我理解这正是迭代器要防止的。

有人可以指出我哪里出错吗?

谢谢

3 个答案:

答案 0 :(得分:3)

如果您想要访问索引,则应使用ListIterator而不是普通Iterator,并且即使删除了元素,也应保持正确更新。使用listIterator()方法获取它,在循环中,使用nextIndex()获取索引,使用next()按顺序获取下一个对象。

此外,如果可以提供帮助,请不要使用索引。只需单独使用该对象,根据需要传递它,或传递索引和元素。无论哪种方式,都不要再次使用索引来访问列表。

ListIterator<Content> i = list.listIterator();
int count = 0;
while (i.hasNext()) {
    int index = i.nextIndex();
    Content element = i.next();
       // ...
    }
}

答案 1 :(得分:1)

不要混用list.indexOf和迭代器。这可能会给你带来麻烦。从元素中获取字符串(我假设Content对象有字符串,对吗?)并使用它。

while (i.hasNext()) {

    Content element = i.next();
    String paragraph = element.yourMethodToGetTheString() // Some method...

    if (paragraph.split(" ").length < minWordCount) {
        i.remove();
    } else {
        irrelevantFuction(index);
    }
}

答案 2 :(得分:1)

此行int index = list.indexOf(element);是否返回正确的索引(尝试打印)?也许您应该更改Content,以便它可以返回自己的段落String paragraph = element.getParagraph(); 如果您从头到尾迭代一个ArrayList,为什么每一轮都需要调用indexOf

尝试:

    Iterator<Content> i = list.iterator();
    int count = 0;
    while (i.hasNext()) {

        Content element = i.next();

        String paragraph = element.getParagraph();

        if (paragraph.split(" ").length < minWordCount) {
           i.remove();
        } else {
         // fixed according to comment
         int index = count++;
         irrelevantFuction(index);
       }
   }