我正在写一个 MR Job。但是我遇到了一个与 Iterable 对象相关的问题。我需要找到它的大小。我将它转换为 List 对象,但这是错误的。(List 可以转换为 Iterable,但不能进行反转。)还有另一种方法,即对对象使用 Iterator 并为每个值增加一个计数器。但这不是最佳解决方案。有人可以提出更好的方法吗?
请帮我。提前致谢。
该Collection
接口提供了一个size()
方法并扩展了Iterable
. 如果你的迭代器恰好来自一个集合,你可以询问它的大小,否则你就不走运了,你只需要迭代到最后。
这是一个实现这一点的hack:
public int size(Iterable<?> it) {
if (it instanceof Collection)
return ((Collection<?>)it).size();
// else iterate
int i = 0;
for (Object obj : it) i++;
return i;
}
您必须通过迭代器并计算项目。例如,
while (iterator.hasNext()) {
iterator.next();
count++;
}
这不是很干净,但迭代器用于迭代的目的,并且没有为此提供任何特定的 api。
但是,迭代器是在哪里创建的?如果它来自另一个对象,例如 Collection 对象,您可以确定源的大小,而不是迭代器本身。
Iterator 上没有 size(),但一些从中派生 Iterator 的 Collections 有一个 size(),例如 java.util.LinkedList.size()。因此,在某些情况下,您可能需要进行迭代。