gpt4 book ai didi

java - 在当前 "while (iterator.hasNext())"循环内添加到迭代器

转载 作者:行者123 更新时间:2023-11-30 05:21:30 26 4
gpt4 key购买 nike

在下面的代码中,我希望迭代运行 3 次。起初,迭代器有 1 个“下一个”,但在第一次迭代期间,迭代器中添加了两个以上的值,因此应该还有两个“下一个”,即 iterator.hasNext() 应该为 true .

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class Foo {

public static void main(String[] args) {
List<String> strings = new ArrayList<>();
strings.add("A");
ListIterator<String> iterator = strings.listIterator();
int i = 0;
while (iterator.hasNext()) {
i++;
String str = iterator.next();
if (str.equals("A")) {
iterator.add("B");
iterator.add("C");
}
// strings.remove(str);
// iterator = strings.listIterator();
}
System.out.println("The iteration was run " + i + " times");
}
}

但它只运行一次。作为解决方法,我可以从原始列表中删除当前迭代,然后重置迭代器(注释行)。但为什么这是必要的呢?迭代器不应该已经知道它有更多的值要迭代吗?

最佳答案

Shouldn't the iterator already know that it has more values to iterate?

不,不应该。如果您查看 add() here 的文档然后你可以在那里找到下面的句子

a subsequent call to next would be unaffected, and a subsequent call to previous would return the new element. (This call increases by one the value that would be returned by a call to nextIndex or previousIndex.)

它清楚地表明添加新元素不会影响当前的循环流程。另外,如果您查看 ArrayListListIterator 实现的源代码:

...
public E next() {
checkForComodification();
int i = cursor;
if (i >= SubList.this.size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (offset + i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[offset + (lastRet = i)];
}

public void add(E e) {
checkForComodification();

try {
int i = cursor;
SubList.this.add(i, e);
cursor = i + 1;
lastRet = -1;
expectedModCount = ArrayList.this.modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}

cursor 变量指向 next() 用于返回下一个元素的位置。正如您所看到的,cursorSubList 大小都会增加。因此,实际上,光标被调整为跳过“旧”下一个位置,转而选择"new"下一个位置。每次调用 add() 时,cursor 都会相应调整。要获取新元素,您应该使用 previous() 或重新开始循环。

此外,您的案例可以说明如下:

    cursor
|
V
0 1
A

添加BC后,cursor仍然指向不存在的元素:

    cursor
|
V
0 1 2 3
A B C

关于java - 在当前 "while (iterator.hasNext())"循环内添加到迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59515852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com