迭代的迭代器 - 用于reduceRight功能

问题描述 投票:4回答:3

尝试实现一些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,反转列表,然后得到一个迭代器,但这不会很有趣:)

java iterator iterable
3个回答
2
投票

简单的答案:不可能以通用的高效方式。

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

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


1
投票

你必须迭代原始的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();
}

1
投票

如果你手上有Iterable,正如你在问题中写的那样,那么有人为你提供了它。我建议要求提供商提供支持反向迭代的Iterable

© www.soinside.com 2019 - 2024. All rights reserved.