为什么迭代器会删除一个额外的项目

时间:2018-01-16 14:37:20

标签: java iterator

我使用迭代器和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

3 个答案:

答案 0 :(得分:1)

每个next()都会从迭代器中获取一个条目。你将玛丽和尼克与尼克比较,然后打印出约翰和乔治。

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

答案 1 :(得分:1)

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

更改这些行:

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
    }
} 

答案 2 :(得分:0)

next()方法被调用两次

  • 一旦进入System.out.println()
  • 一旦进入if()