我正在写一份MR Job。但我遇到了与Iterable对象相关的问题。我需要找到它的大小。我将它转换为List对象,但这是错误的。(List可以转换为Iterable,但不能进行反转。)还有另一种方法,即通过使用Iterator作为对象并为每个值递增计数器。但这不是最佳解决方案。任何人都可以提出更好的方法吗?。
请帮帮我。 提前谢谢。
答案 0 :(得分:15)
Collection
界面提供size()
方法,并扩展Iterable
。如果你的迭代器恰好来自一个集合,你可以问它的大小,否则你运气不好,你只需要迭代到最后。
这是一个实现此目的的黑客攻击:
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;
}
答案 1 :(得分:5)
你必须通过迭代器并计算项目。 例如,
while (iterator.hasNext()) {
iterator.next();
count++;
}
这不是很干净但迭代器的目的是迭代,并没有为此提供任何特定的api。
但是,迭代器在哪里创建?如果它来自另一个对象,例如Collection对象,则可以确定源的大小而不是迭代器本身。
答案 2 :(得分:0)
Iterator上没有size(),但是派生Iterator的一些Collections有一个size(),比如java.util.LinkedList.size()。因此,您可能需要在某些情况下进行迭代。