为了账号安全,请及时绑定邮箱和手机立即绑定

可以以相反的顺序为Java中的每个循环做一个吗?

可以以相反的顺序为Java中的每个循环做一个吗?

RISEBY 2019-11-28 09:42:39
我需要使用Java以相反的顺序遍历一个List。所以它转发到哪里:for(String string: stringList){//...do something}是否有某种方法可以针对每种语法以相反的顺序迭代stringList ?为了清楚起见:我知道如何以相反的顺序迭代列表,但想知道(出于好奇的缘故)如何针对每种样式进行处理。
查看完整描述

3 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

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


作为一种更有效的解决方案,您可以编写一个装饰器,该装饰器将List的反向视图呈现为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);

}


查看完整回答
反对 回复 2019-11-28
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

有关列表,您可以使用Google Guava库:


for (String item : Lists.reverse(stringList))

{

    // ...

}

请注意,这不会颠倒整个集合,也不会做任何类似的事情-它只允许以相反的顺序进行迭代和随机访问。这比先反转集合更有效。Lists.reverse


要逆转任意可迭代的内容,您必须先阅读所有内容,然后向后“重播”它。


(如果你还没有使用它,我会彻底建议你看看番石榴。这是伟大的东西。)


查看完整回答
反对 回复 2019-11-28
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

List(与Set不同)是一个有序的集合,并且对其进行迭代确实可以按合同保留订单。我本来希望Stack以相反的顺序进行迭代,但是不幸的是它没有。因此,我能想到的最简单的解决方案是:


for (int i = stack.size() - 1; i >= 0; i--) {

    System.out.println(stack.get(i));

}

我意识到这不是一个“针对每个”循环的解决方案。我宁愿使用for循环,也不愿引入像Google Collections这样的新库。


Collections.reverse()也可以完成此工作,但它会更新列表,而不是以相反的顺序返回副本。


查看完整回答
反对 回复 2019-11-28
  • 3 回答
  • 0 关注
  • 390 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信