【发布时间】:2019-07-10 21:19:03
【问题描述】:
尝试实现一些 reduceRight 功能。 对于性能来说,从右到左迭代会很好,而不是先反转所有内容,然后再从左到右。通常我们会这样做:
Iteratable iterable ...;
Iterator iterator = iterable.iterator();
iterator.next();
但我正在寻找类似的东西:
Iteratable iterable ...;
Iterator iterator = iterable.reverseIterator();
iterator.next();
我看到了这个解决方案:Iterating through a list in reverse order in java
当前接受的答案表明这是可行的:
ArrayList<...> a = new ArrayList<...>();
// Add elements to list.
// Generate an iterator. Start just after the last element.
ListIterator li = a.listIterator(a.size());
// Iterate in reverse.
while(li.hasPrevious()) {
System.out.println(li.previous());
}
任何人都知道如何在手头只有Iterable 的情况下实现反向迭代吗?我手头没有ArrayList 或列表,我手头有Iterable。我想我可以将 Iterable 转换为 ArrayList,反转列表,然后得到一个迭代器,但这并不有趣 :)
【问题讨论】:
-
你不能。迭代器只支持单向遍历。您必须将元素复制到堆栈并弹出它们。鉴于您正在努力实现性能,我不会这样做 - 看看您是否可以在另一个方向上重新表达您的 reduce。
-
@BoristheSpider 是的,这就是我的想法,鉴于 OP 中的信息,您能否提供最佳解决方案?谢谢
-
请记住,
Iterable在理论上可以是无限的。这就是为什么在 API 级别不支持此功能的原因。您应该使用支持反向遍历的数据结构。 -
@JoeC 这是一个库,因此尝试使用
Iterable支持尽可能多的数据类型 -
@JoeC 的观点值得牢记——
Stream和Iterator都可以是无限的;以Guava'sIterators.cycle为例。我会避免公开允许您无法支持的内容的 API。