获得迭代器的数量/长度/大小的最佳方法是什么?

有一个“计算上”的快速方法来获得一个迭代器的计数?

int i = 0; for ( ; some_iterator.hasNext() ; ++i ) some_iterator.next(); 

似乎浪费CPU周期。

如果你刚刚获得了迭代器,那就是你必须做的 – 它不知道剩下的迭代项有多less,所以你不能查询它的结果。

但是,许多迭代器来自集合,您可以经常查询它们的大小。 如果这是一个用户创build的类,你得到的迭代器,你可以看看在这个类上提供一个size()方法。

简而言之,在只有迭代器的情况下,没有更好的方法,但是更多的时候,您可以访问基础集合或对象,从中可以直接获取大小。

使用番石榴图书馆 :

 int size = Iterators.size(iterator); 

在内部它只是遍历所有的元素,所以它只是为了方便。

当你到达迭代器的末尾时,你的代码会给你一个exception。 你可以这样做:

 int i = 0; while(iterator.hasNext()) { i++; iterator.next(); } 

如果你有权访问底层的集合,你可以调用coll.size()

编辑确定你已经修改…

没有更好的办法,如果你只是迭代器。

解决方法是更改​​您的应用程序,使其不需要计数,或通过其他方式获取。 (例如通过一个Collection而不是Iterator …)

如果你拥有的只是迭代器,那么不,没有“更好”的方法。 如果迭代器来自一个集合,你可以按照大小来设置。

请记住,Iterator只是一个遍历不同值的接口,你可能会有这样的代码

  new Iterator<Long>() { final Random r = new Random(); @Override public boolean hasNext() { return true; } @Override public Long next() { return r.nextLong(); } @Override public void remove() { throw new IllegalArgumentException("Not implemented"); } }; 

要么

  new Iterator<BigInteger>() { BigInteger next = BigInteger.ZERO; @Override public boolean hasNext() { return true; } @Override public BigInteger next() { BigInteger current = next; next = next.add(BigInteger.ONE); return current; } @Override public void remove() { throw new IllegalArgumentException("Not implemented"); } }; 

另一种select是将Iterable转换为List

 int count = Lists.newArrayList(some_iterator).size(); 

迭代器对象包含您的集合包含的相同数量的元素。

 List<E> a =...; Iterator<E> i = a.iterator(); int size = a.size();//Because iterators size is equal to list a's size. 

但不是获取迭代器的大小,并通过索引0迭代到该大小,最好迭代迭代器的next()方法。