2012-02-17 8 views
3

可能性の重複:前方の反復のため
Can one do a for each loop in java in reverse order?Javaの逆のforeach

for (int i=0; i<pathElements.length; i++){ 
    T pathElem = pathElements[i]; 
    ....... 
} 

私はforeachのようにそれをコーディングすることができます。

for(T pathElem : pathElements){ 
    ....... 
} 
を10

foreachが逆に反復できるようにスイッチはありますか?

for (int i=pathElements.length-1; i>=0; i--){ 
    T pathElem = pathElements[i]; 
    ....... 
} 

foreachに逆の反復スイッチがありますか?

(ない場合は、あなたはJDK 8、9、などは、この機能が含まれていることをエキサイティングなアイデアだと思いませんか?)

+8

http://stackoverflow.com/questions/1098117/can-one-do-a-for-each-loop-in- Java-in-reverse-order – oopbase

答えて

8

foreachループが基づいているので、それは根本的に不可能ですIterableおよびIteratorインターフェイスであり、これらは逆反復の概念を持たない。リストとして配列の逆

for (T elem : Lists.reverse(Arrays.asList(array))) { 
    ... 
} 

反復:グアバを使用

+0

これの優れた例は、無限のシーケンスです。 「最後の」要素が存在しないので、順序を逆にすることは数学的に不可能である。 – emory

+1

私は[this](http://stackoverflow.com/questions/1098117/can-one-do-a-for-each-loop-in-java-in-reverse-order)のリンクを見て、それができると思います – saman

+1

@saman:ソートされたもの( 'TreeSet'のようなもの)やインデックスの概念(' List'や配列のようなもの)を持つことができます。ループはオンになりますが、一般的な 'Iterable'ではまだできません。 –

0

いいえ、ありません。一番近いのはまず配列を逆にすることです。

ArrayUtils.reverse(array); 
for (Item x : array){} 
4

ない場合、あなたはJDK 8、9、 などは、この機能が含まれていることをエキサイティングなアイデアだと思いませんか?

ない私が見てくださいそのような特徴の値。

今のところArrays.asListを使用してリストに変換された配列のコピーに対してCollections.reverseを使用してそれを繰り返すことができます。

+0

そこには値があります。これらの余分な行と潜在的な処理の代わりに(理想的には)foreach行に1つの単語を追加することができます。 –

+0

または少なくともJDKに組み込まれたReverseIteratorを使用するので、毎回自分自身をロールバックする必要はなく、サードパーティーを使用する必要はありません。 – rogerdpack

-1

pathElementsがカスタムクラスである場合、Iterableを実装することによってどのように反復するべきかを定義することができます。そうでなければ、pathElementsを単純にカプセル化し、反復可能な実装メソッドをオーバーライドできます。

はまた、このようなものを作り、反復処理可能なインターフェースのメソッドをオーバーライドすることができます。

public class pathElementsReversed extends pathElements {} 

をそして、あなたは、このような各使用することができます。

foreach (pathElement p : (pathElementsReversed) pathElements) {...} 
5

。 (したがって、オーバーヘッドは一定しており、基本配列は変更されません)。