我需要使用Java以相反的顺序遍历列表.

因此,它向前的方向是:

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

有没有什么方法可以使用for each语法以相反的顺序迭代string List?

为了清楚起见:我知道如何以逆序迭代列表,但我想知道(出于好奇心)如何以for each样式进行迭代.

推荐答案

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

作为一种更有效的解决方案,您可以编写一个修饰器,将列表的反向视图表示为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相关问答推荐

CSS应用于一个端点,但不应用于Thymeleaf中的另一个端点

尽管类型擦除,instanceof与泛型在Java中如何工作?

Quarkus keycloat配置不工作.quarkus. keycloak. policy—enforcer. enable = true在. yaml表示中不工作

ApachePOI:不带换行的新行

上下文初始化期间遇到异常-使用Java配置配置HibernateTemplate Bean时

JavaFX如何在MeshView中修复多个立方体?

如何从Keyloak映射Hibernate实体中的用户

如何让JVM在SIGSEGV崩溃后快速退出?

如何从日志(log)行中删除包名称?

内存和硬盘中的Zip不同,这会导致下载后的Zip损坏

扩展视图高度,并将其拖动到较低的视图上,而不是将其向下推?

垃圾回收器是否真的删除超出作用域的对象?

为什么项目名称出现在我的GET请求中?

在ECLIPSE上的M1 Pro上运行JavaFX的问题

谷歌应用引擎本地服务器赢得';t在eclipse上运行

为什么Instant没有从UTC转换为PostgreSQL的时区?

读取ConcurrentHashMap中的可变对象

在数组中查找素数时出现逻辑错误

Spring Mapstruct如何获取Lazy初始化实体字段的信息?

javax.crypto-密码对象-提供者服务是如何工作的?