【问题标题】:Java: NoSuchElementException when iterating through ArrayListJava:遍历 ArrayList 时出现 NoSuchElementException
【发布时间】:2013-05-05 06:57:06
【问题描述】:

我想删除重复的元素,因此遍历 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()) 不应该阻止这种情况吗?

【问题讨论】:

  • final Set&lt;Person&gt; unqiuePeople = new TreeSet&lt;Person&gt;(persons) 将在一行中完成您想要的操作。
  • 使用适当定义的比较器/equals() 方法
  • @BrianAgnew 鉴于 OP 已经在使用 Collections.sort 来订购我认为已经定义的项目。

标签: java arraylist iterator nosuchelementexception


【解决方案1】:

问题是您调用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;
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      while(it.hasNext()) {
              if(tmp.getLastDiscovered() == it.next().getLastDiscovered()) {
                  getHelper().delete(tmp);
              }
      

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

      tmp = it.next();
      

      这给了你一个例外。

      【讨论】:

        【解决方案4】:

        如果您使用的是 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);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-02
          • 2014-10-21
          • 2013-12-26
          • 2015-02-13
          • 1970-01-01
          • 2015-11-28
          • 2014-03-22
          • 2013-04-05
          相关资源
          最近更新 更多