2013-05-10 81 views
2

我想删除重复的元素,因此迭代通过ArrayList并比较两个连续的元素。 (人具有可比性)Java: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())阻止?

+0

'决胜盘 unqiuePeople =新TreeSet的(人)'会做你在一行中想要的东西。 – 2013-05-10 14:53:11

+0

使用适当定义的比较器/等于()方法 – 2013-05-10 14:57:00

+0

@BrianAgnew假设OP已经在使用'Collections.sort'来订购物品,我假定这已经定义。 – 2013-05-10 15:01:20

回答

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

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

如果你想删除重复项,为什么不只是填写一个TreeSet(提供适当的比较器)你的列表? Set的语义是这样的,你将有一组独特的元素。

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

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

tmp = it.next(); 

这给你一个例外。

0

如果您使用的是JDK 1.5.0或更高版本(最有可能的版本,自2004年发布以来),您可以使用foreach loop来完全避免迭代器,从而大大简化代码。

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