我需要使用Java以相反的顺序遍历一个List。

所以它转发到哪里:

for(String string: stringList){
//...do something
}

是否有某种方法可以使用每种语法以相反的顺序迭代stringList?

为了清楚起见:我知道如何以相反的顺序迭代列表,但想知道(出于好奇的缘故)如何针对每种样式进行处理。

最佳答案

实际上,Collections.reverse方法返回一个新列表,其中原始列表的元素以相反的顺序复制到该列表中,因此就原始列表的大小而言,它具有O(n)性能。

作为一种更有效的解决方案,您可以编写一个装饰器,该装饰器将List的反向 View 呈现为Iterable。装饰器返回的迭代器将使用装饰列表的ListIterator以相反的顺序遍历元素。

例如:

public class Reversed<T> implements Iterable<T> {
    private final List<T> original;

    public Reversed(List<T> original) {
        this.original = original;
    }

    public Iterator<T> iterator() {
        final ListIterator<T> i = original.listIterator(original.size());

        return new Iterator<T>() {
            public boolean hasNext() { return i.hasPrevious(); }
            public T next() { return i.previous(); }
            public void remove() { i.remove(); }
        };
    }

    public static <T> Reversed<T> reversed(List<T> original) {
        return new Reversed<T>(original);
    }
}

您会像这样使用它:
import static Reversed.reversed;

...

List<String> someStrings = getSomeStrings();
for (String s : reversed(someStrings)) {
    doSomethingWith(s);
}

关于java - 可以以相反的顺序为Java中的每个循环做一个吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1098117/

10-09 13:22