1. ホーム
  2. java

[解決済み] javaでfor eachループを逆順に行うことはできますか?

2022-04-24 11:25:24

質問

Javaを使ってListを逆順に実行する必要があります。

で、これがフォワードをするところ。

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

を使用して、stringList を逆順に反復する方法はありますか? それぞれ の構文が使えますか?

わかりやすくするために。私はリストを逆順に反復する方法を知っていますが、(好奇心で)それを それぞれ のスタイルになります。

解決方法は?

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);
}