首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取迭代器的计数/长度/大小的最佳方法是什么?

获取迭代器的计数/长度/大小的最佳方法是什么?
EN

Stack Overflow用户
提问于 2012-03-15 20:58:43
回答 5查看 197.7K关注 0票数 107

有没有一种“计算性”的快速方法来获得迭代器的计数?

代码语言:javascript
运行
复制
int i = 0;
for ( ; some_iterator.hasNext() ; ++i ) some_iterator.next();

..。这似乎是对CPU周期的浪费。

EN

回答 5

Stack Overflow用户

发布于 2014-11-11 21:51:51

使用Guava library

代码语言:javascript
运行
复制
int size = Iterators.size(iterator);

在内部,它只是迭代所有元素,所以这只是为了方便。

票数 99
EN

Stack Overflow用户

发布于 2018-01-12 02:52:50

您将始终需要迭代。但是,您可以使用Java 8、9来执行计数,而无需显式地循环:

代码语言:javascript
运行
复制
Iterable<Integer> newIterable = () -> iter;
long count = StreamSupport.stream(newIterable.spliterator(), false).count();

下面是一个测试:

代码语言:javascript
运行
复制
public static void main(String[] args) throws IOException {
    Iterator<Integer> iter = Arrays.asList(1, 2, 3, 4, 5).iterator();
    Iterable<Integer> newIterable = () -> iter;
    long count = StreamSupport.stream(newIterable.spliterator(), false).count();
    System.out.println(count);
}

这将打印:

代码语言:javascript
运行
复制
5

有趣的是,您可以通过更改此调用的parallel标志来并行化count操作:

代码语言:javascript
运行
复制
long count = StreamSupport.stream(newIterable.spliterator(), *true*).count();
票数 13
EN

Stack Overflow用户

发布于 2015-10-06 20:08:42

使用Guava library时,另一种选择是将Iterable转换为List

代码语言:javascript
运行
复制
List list = Lists.newArrayList(some_iterator);
int count = list.size();

如果您还需要在获取迭代器的大小后访问其元素,请使用此选项。通过使用Iterators.size(),您不再能够访问迭代的元素。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9720195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档