2

我想删除重复的元素,因此遍历 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();
    }
}

我得到一个 NoSuchElementExceptiontmp = it.next();

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

4

4 回答 4

5

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

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

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

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

Person tmp = null;
for (Person person : persons) {
    if (tmp != null && tmp.getLastDiscovered() == person.getLastDiscovered()) {
        getHelper().delete(tmp);
    }
    tmp = person;
}
于 2013-05-10T14:41:55.827 回答
1

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

如果要删除重复项,为什么不使用列表填充TreeSet(提供适当的比较器)?a 的语义Set是这样的,您将拥有一组不同的元素。

于 2013-05-10T14:42:32.737 回答
0
while(it.hasNext()) {
        if(tmp.getLastDiscovered() == it.next().getLastDiscovered()) {
            getHelper().delete(tmp);
        }

在那“一会儿”之后,您将来到列表的末尾。然后,当它没有下一个值时,您将调用下面的行。

tmp = it.next();

这给了你一个例外。

于 2013-05-10T14:45:28.717 回答
0

如果您使用的是 JDK 1.5.0 或更高版本(您很可能是,因为它是 2004 年发布的),您可以使用foreach 循环完全避免迭代器,从而大大简化代码。

ArrayList<Person> persons = getHelper().findAllPersons();
Collections.sort(persons);
for (Person person : persons) {
    if(tmp.getLastDiscovered() == person.getLastDiscovered()) {
        getHelper().delete(tmp);
    }
}
于 2013-05-10T14:46:33.273 回答