1

我对 Java 中的迭代器行为有疑问。

我有这样的电话:

myIterable.iterator().hasNext()

如果此调用返回 true,我可以确定该集合至少有两个元素吗?从 Java API 规范中,我只能发现 true 意味着还有一个元素可以通过next(). 但是如果指针在最开始会发生什么(意味着是否hasNext()可以单独识别第一个元素)

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Iterator.html

如果迭代有更多元素,则为 true。但是更多元素也可能意味着第一个元素?

[编辑]

我怎么知道迭代器是否有两个元素要遍历?当然,我可以迭代和计数,但在我的情况下,我不能返回或迭代两次或克隆迭代器,这是一个 Hadoop 迭代器。

4

8 回答 8

5

它可能意味着第一个。你只能确定它有多个元素

于 2012-06-27T12:40:34.387 回答
3

hasNext() 返回 true 或 false 使您能够区分零个项目和一个或多个(在迭代开始时)。

您想知道它是否有两个或更多,而无需开始迭代。我认为,基本上,你不能。公开该信息不仅仅是迭代器必须做的:使下一个且仅下一个项目可用(以及有关该项目是否存在的信息)。

可能迭代器本身甚至还没有这些知识!

当然,您可以自由地记住您已经从列表中取出的项目。然后你可以稍后使用它们,一旦你知道列表中实际上有两个或更多项目。

如果您需要将迭代器传递给其他代码,您可以编写自己的实现迭代器的类,在内部将前两项作为成员变量记住并首先分发它们,然后继续迭代原始迭代器中的其余项(如果还有剩余) - 因此对原始迭代器的引用也需要存储在您的定制迭代器中

于 2012-06-27T13:03:47.113 回答
2

Java 迭代器位于第一个元素之前。你的表达myIterable.iterator().hasNext()表明至少有一个元素。

于 2012-06-27T12:41:29.207 回答
1

hasNext告诉你还有另一个元素可以用next(). 所以这只是意味着你至少有一个元素。

于 2012-06-27T12:41:27.540 回答
1

如果myIterable.iterator().hasNext()返回true,则表示至少有一个元素,您可以使用它next()来访问它。

于 2012-06-27T12:46:00.543 回答
1

不。如果 hasNext() 返回 true 意味着该集合具有至少一个元素,因为迭代器的原点位置应该在第一个元素之前

List l = new ArrayList();
l.add(1);
Iterator it = l.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}

结果将是1因为迭代器的原点位置应该在第一个元素之前。当我们第一次检查it.hasNext ( )时,它会返回true,因为它只有一个元素。然后,使用 it.next() 打印元素。现在只是,迭代器在第一个位置。当我们第二次检查it.hasNext()时,它会返回false

于 2012-06-27T12:51:08.407 回答
1

我怎么知道迭代器是否有两个元素要迭代?当然,我可以迭代和计数,但在我的情况下,我不能返回或迭代两次或克隆迭代器,这是 hadoop 可迭代的。

没有办法做到这一点。也许迭代器不适合您的场景。

于 2012-06-27T12:58:05.227 回答
0

在迭代器中,它有一个名为 cursor 的字段。这个 cursor 的初始值是集合对象的大小。当你调用方法 next() 时,它会--。hasNext() 方法检查光标是否等于零。它的零返回false,否则返回true。

But the list and map is not the same, their difference is the concrete realization, the original is the same.List check size, map check end node.

于 2012-06-27T13:21:00.383 回答