7

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

请帮我。提前致谢。

4

3 回答 3

15

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;
}
于 2012-07-10T13:55:05.143 回答
5

您必须通过迭代器并计算项目。例如,

            while (iterator.hasNext()) {
            iterator.next();
            count++;
        }

这不是很干净,但迭代器用于迭代的目的,并且没有为此提供任何特定的 api。

但是,迭代器是在哪里创建的?如果它来自另一个对象,例如 Collection 对象,您可以确定源的大小,而不是迭代器本身。

于 2012-07-10T13:59:18.357 回答
0

Iterator 上没有 size(),但一些从中派生 Iterator 的 Collections 有一个 size(),例如 java.util.LinkedList.size()。因此,在某些情况下,您可能需要进行迭代。

于 2012-07-10T13:56:18.673 回答