反向迭代器-用于reduceRight功能

时间:2019-02-17 07:49:22

标签: java iterator iterable

尝试实现一些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,反转该列表,然后获得一个迭代器,但这并不好玩:)

3 个答案:

答案 0 :(得分:2)

简单的答案:用通用的表现方式是不可能的。

迭代器的本质是使您一个方向,而不是两个方向。并想象一个单链表。那东西真的只有“一个方向”!

因此如何解决可迭代事物的问题确实需要您查看确切的实现。 如果没有这种可能性,则必须使用中间数据结构在反转之前获取所有条目。

答案 1 :(得分:1)

您必须在原始npm install geckodriver@1.14上进行一次迭代,以构造一个反转的Iterator(假设原始Iterator是有限的)。

例如:

Iterator

答案 2 :(得分:1)

如果您手头有一个Iterable(如您在问题中所写),那么有人会为您提供。我建议要求提供者提供一个支持反向迭代的Iterable