我想删除重复的元素,因此迭代一个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();
while(it.hasNext())
不应该阻止吗?
答案 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);
}
}