Java5 foreachループで最初の反復をスキップするエレガントな方法はありますか?
擬似コードの例:
for ( Car car : cars ) {
//skip if first, do work for rest
.
.
}
エレガントとは言いませんが、おそらく「最初の」ブール値を使用するよりも良いでしょう。
for ( Car car : cars.subList( 1, cars.size() ) )
{
.
.
}
それ以外は、おそらくエレガントな方法はありません。
新しいJava 8 Stream API を使用すると、実際に非常にエレガントになります。skip()
メソッドを使用するだけです。
cars.stream().skip(1) // and then operations on remaining cars
Guava Iterables.skip()
を使用します。
何かのようなもの:
for ( Car car : Iterables.skip(cars, 1) ) {
// 1st element will be skipped
}
(これを msandifordの回答 の最後から取得し、スタンドアロンの回答にしたかった)
for (Car car : cars)
{
if (car == cars[0]) continue;
...
}
私には十分にエレガントです。
SeanAのコードには小さなエラーがあります。サブリストの2番目の引数は排他的インデックスとして扱われるため、
for (Car car : cars.subList(1, cars.size()) {
...
}
(私は答えにコメントすることができないようです。したがって、新しい答えです。それをするために特定の評判が必要ですか?)
これには少し遅れましたが、次のようなヘルパーメソッドを使用できます。
_public static <T> Iterable<T> skipFirst(final Iterable<T> c) {
return new Iterable<T>() {
@Override public Iterator<T> iterator() {
Iterator<T> i = c.iterator();
i.next();
return i;
}
};
}
_
そして、次のように使用します:
_public static void main(String[] args) {
Collection<Integer> c = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
for (Integer n : skipFirst(c)) {
System.out.println(n);
}
}
_
「n」をスキップするように一般化することは、読者のための演習として残されています:)
[〜#〜] edit [〜#〜]:よく見ると、グアバにはIterables.skip(...)
があります ここ 。
私はJava人ではありませんが、以下を使用できます:
for ( Car car : cars.tail() )
Java.utilから Groovy JDK 経由で
エレガント?あんまり。ブール値をチェック/設定する必要があります。
For-eachループは、すべての実用的な目的で、イテレーターを使用するための派手な構文です。ループを開始する前に、イテレーターを使用して前進するだけの方が良いでしょう。
これはエレガントではないかもしれませんが、forループの外側で整数変数を初期化し、ループ内の反復ごとにそれをインクリメントできます。プログラムは、カウンターが0より大きい場合にのみ実行されます。
int counter = 0;
for ( Car car : cars ) {
//skip if first, do work for rest
if(counter>0){
//do something
}
counter++;
}
それほどエレガントではありませんが、イテレータで動作します
Iterator<XXXXX> rows = array.iterator();
if (rows.hasNext()){
rows.next();
}
for (; rows.hasNext();) {
XXXXX row = (XXXXX) rows.next();
}
カウンターを使用できます。それほど成熟したコーディングではありませんが、それでもリストから最初の要素をスキップする最も簡単な方法だと思います。
int ctr=0;
for(Resource child:children) {
if(ctr>0) { //this will skip the first element, i.e. when ctr=0
//do your thing from the 2nd element onwards
}
ctr++;
}
私はここでいくつかの良い解決策を見ましたが、私の意見ではこれから避けるべきです:
for (Car car : cars)
{
if (car == cars[0]) continue;
...
}
理由は、ループの最初の繰り返しでスキップするように要求したためです。この方法は、コンテナの最初のインデックスにある車が一度だけ表示される場合にのみ機能します。
しかし、この車がコンテナ内に複数回現れたらどうなるでしょうか?その場合、再度スキップし、最初の反復を除くそれ以上の反復をスキップします。