gpt4 book ai didi

java - 迭代器可以更改它正在迭代的集合吗? java

转载 作者:搜寻专家 更新时间:2023-10-31 08:26:29 26 4
gpt4 key购买 nike

我正在尝试使用迭代器的迭代次数作为计数器,但想知道这样做的后果。

private int length(Iterator<?> it) {
int i = 0;

while(it.hasNext()) {
it.next();
i++;
}

return i;
}

这很好用,但我担心迭代器可能会在幕后做什么。也许当我在堆栈上迭代时,它会从堆栈中弹出项目,或者如果我正在使用优先级队列,它会修改优先级。

javadoc 关于迭代器是这样说的:

next
E next()
Returns the next element in the iteration.
Returns:
the next element in the iteration
Throws:
NoSuchElementException - if the iteration has no more elements

我看不到迭代这个未知集合不会修改它的保证。我是在考虑不切实际的边缘情况,还是这是一个问题?有没有更好的办法?

最佳答案

Iterator 只是为某种流提供了一个接口(interface),因此 next() 不仅完全有可能以某种方式销毁数据,而且甚至Iterator 中的数据可能是唯一且不可替代的。

我们可以想出更直接的例子,但一个简单的例子是 DirectoryStream 中的 Iterator .虽然 DirectoryStream 在技术上是 Iterable,但它只允许构造一个 Iterator,因此如果您尝试执行以下操作:

Path dir = ...
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
int count = length(stream.iterator());
for (Path entry: stream) {
...
}
}

您会在 foreach block 中遇到异常,因为流只能迭代一次。所以总而言之,您的 length() 方法可能会更改对象并丢失数据。

此外,Iterator 没有理由必须与某个单独的数据存储相关联。以 answer I gave a few months 为例之前提供了一种干净的方法来选择 n 随机数。通过使用无限的 Iterator,我们能够懒惰地提供、过滤和传递任意大量的随机数据,无需一次存储所有数据,甚至不需要计算它们直到需要它们。因为 Iterator 不支持任何数据结构,查询它显然是破坏性的。

话虽如此,这些示例不会使您的方法变得糟糕。请注意 Guava library (每个人都应该使用)提供一个 Iterators完全按照您上面详述的行为进行分类,称为 size()符合集合框架。然后,使用此类方法的用户就有责任了解他们正在处理的数据类型,并避免进行粗心的调用,例如试图计算他们在 Iterator 中的结果数量知道无法替代。

关于java - 迭代器可以更改它正在迭代的集合吗? java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21081318/

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