尝试实现一些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
或List,我有一个Iterable
。我想我可以将Iterable转换为ArrayList,反转列表,然后得到一个迭代器,但这不会很有趣:)
简单的答案:不可能以通用的高效方式。
迭代器的本质是给你一个方向,而不是两个方向。想象一个单链表。那东西真的有“只有一个方向”!
因此,如何反转可迭代的东西的问题确实需要您查看确切的实现。如果没有这种可能性,您必须使用中间数据结构在反转之前获取所有条目。
你必须迭代原始的Iterator
一次,以构建一个反向的Iterator
(假设你原来的Iterator
是有限的)。
例如:
static <T> Iterator<T> getReversedIterator(Iterable<T> iterable) {
Iterator<T> iter = iterable.iterator();
List<T> rev = new ArrayList<>();
while (iter.hasNext()) {
rev.add (0, iter.next());
}
return rev.iterator();
}
如果你手上有Iterable
,正如你在问题中写的那样,那么有人为你提供了它。我建议要求提供商提供支持反向迭代的Iterable
。