如何找到Iterable对象的大小?

时间:2012-07-10 11:56:44

标签: java iterator

我正在写一份MR Job。但我遇到了与Iterable对象相关的问题。我需要找到它的大小。我将它转换为List对象,但这是错误的。(List可以转换为Iterable,但不能进行反转。)还有另一种方法,即通过使用Iterator作为对象并为每个值递增计数器。但这不是最佳解决方案。任何人都可以提出更好的方法吗?。

请帮帮我。 提前谢谢。

3 个答案:

答案 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()。因此,您可能需要在某些情况下进行迭代。