Java:迭代ArrayList时的NoSuchElementException

时间:2013-05-10 14:40:11

标签: java arraylist iterator nosuchelementexception

我想删除重复的元素,因此迭代一个ArrayList并比较两个连续的元素。 (人数可比)

ArrayList<Person> persons = getHelper().findAllPersons();
Collections.sort(persons);
ListIterator<Person> it = persons.listIterator();
if(it.hasNext()) {
    Person tmp = it.next();
    while(it.hasNext()) {
        if(tmp.getLastDiscovered() == it.next().getLastDiscovered()) {
            getHelper().delete(tmp);
        }
    tmp = it.next();
    }
}

我在tmp = it.next();

收到NoSuchElementException

while(it.hasNext())不应该阻止吗?

4 个答案:

答案 0 :(得分:4)

问题是你正在调用it.next()两次,这将使迭代器前进两次。

您应该存储该值以避免重复副作用。

    Person person = it.next();
    if (tmp.getLastDiscovered() == person.getLastDiscovered()) {
        getHelper().delete(tmp);
    }
    tmp = person;

或者,您可以使用for-each循环来避免需要与迭代器进行交互(我假设所有Person都不为null):

Person tmp = null;
for (Person person : persons) {
    if (tmp != null && tmp.getLastDiscovered() == person.getLastDiscovered()) {
        getHelper().delete(tmp);
    }
    tmp = person;
}

答案 1 :(得分:1)

您为每个it.next()电话拨打it.hasNext()两次(可能),因此您的错误。

如果您想删除重复内容,为什么不只是在列表中填充TreeSet(提供相应的比较器)? Set的语义是这样的,你将拥有一组不同的元素。

答案 2 :(得分:0)

while(it.hasNext()) {
        if(tmp.getLastDiscovered() == it.next().getLastDiscovered()) {
            getHelper().delete(tmp);
        }

在那之后'while'你将要到列表的末尾。然后当它没有下一个值时,你正在调用下面的一行。

tmp = it.next();

这给你一个例外。

答案 3 :(得分:0)

如果您正在使用JDK 1.5.0或更高版本(自2004年发布以来很可能使用它),您可以使用foreach loop完全避免使用迭代器,从而大大简化代码。 / p>

ArrayList<Person> persons = getHelper().findAllPersons();
Collections.sort(persons);
for (Person person : persons) {
    if(tmp.getLastDiscovered() == person.getLastDiscovered()) {
        getHelper().delete(tmp);
    }
}