【问题标题】:Why does Iterator remove an extra item为什么迭代器删除一个额外的项目
【发布时间】:2018-01-16 14:37:20
【问题描述】:

我使用了一个迭代器和一个 while 循环来打印出 ArrayList 的所有条目。

我还使用了for 循环来打印出同一个ArrayList 的所有条目。

我试图用迭代器删除一个项目。似乎它已从 ArrayList 中正确删除,但 While 循环还删除了另外一项“Mary”。

这是资源代码。

public static void main(String[] args) {
    ArrayList<String> names = new ArrayList<String>();
    names.add("John");
    names.add("Mary");
    names.add("George");
    names.add("Nick");

    Iterator<String> iterator = names.iterator();

    System.out.println("Iterator method: ");
    while (iterator.hasNext()){
        System.out.println(iterator.next());
        if (iterator.next().equals("Nick")){
            iterator.remove();
        }
    }

    System.out.println("\nFOR loop method: ");
    for (int i=0; i < names.size(); i++){
        System.out.println(names.get(i));
    }
}

为什么“玛丽”被删除了?

Iterator method: 
John
George

FOR loop method: 
John
Mary
George

Process finished with exit code 0

【问题讨论】:

  • 您调用iterator.next() 两次,所以它当然会增加两次(并跳过Mary)。它正在做你告诉它做的事情,所以你不明白什么?
  • 每当你所有的 iterator.next 你改变位置。这就是为什么您需要在变量内部的循环中调用一次。
  • SO 不是一个很棒的教程网站。 tutorialspoint.com/java/java_using_iterator.htm

标签: java iterator


【解决方案1】:

您正在调用next(),因此迭代器分为两个步骤。如果您想对iterator.next() 返回的String 执行更多操作,您需要将此值存储在一个变量中,并使用此变量执行这些操作。

更改这些行:

while (iterator.hasNext()) {
    System.out.println(iterator.next()); // first valie returned by iterator
    if (iterator.next().equals("Nick") { // second value returned by the iterator
        iterator.remove(); // second value returned by the iterator removed 
    }
}

到:

while (iterator.hasNext()) {
    String s = iterator.next(); // here you store value returned by the iterator to make proper checks further
    System.out.println(s); // here you use created variable instead of calling next()
    if (s.equals("Nick") {, // again, created variable instead of next()
        iterator.remove(); // here you remove last value returned by the iterator
    }
} 

【讨论】:

  • 先生,这真的很有帮助!我很感激你的时间!非常感谢!
  • @FotisZachopoulos 很高兴我能帮助你:-)
【解决方案2】:

每个next() 都从迭代器中获取一个条目。您将 Mary 和 Nick 与 Nick 进行比较,然后打印出 John 和 George。

仅在循环中调用一次next(),并将其保存在一个变量中,然后用于打印和比较。

【讨论】:

  • 非常感谢先生!
【解决方案3】:

next() 方法被调用两次

  • 在 System.out.println() 中一次
  • 在 if() 中一次

【讨论】:

  • 非常感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 2015-08-19
  • 2020-08-01
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
  • 2011-02-07
  • 2013-10-05
相关资源
最近更新 更多