差動序で繰り返し処理する反復子とともに、for文は、while
-
21-08-2019 - |
質問
ご利用する場合は、序で繰り返し処理する反復子オブジェクトを使用してい ながらループ (この場合、すべての図書学習Java、 考え方のJava ブルース-Eckel):
Iterator it=...
while(it.hasNext()){
//...
}
だいた上で誰かをご利用 forループ:
Iterator it=...
for (Iterator it=...; it.hasNext();){
//...
}
I don'ここでの選択肢:
- を利用したい forループ きいコレクションの通常の配列(array)または特別の規定のステップ(一般的に宣言されたとして単純増
counter++
). - を利用したい ながらループ がループを終了していま起こ制約が論理条件終了します。
この問題のスタイル-コーディングなしその他の原因は存在するその他のプログラムの性能するものなのかどうかに関していか?
コ毎の声
解決
ループのための正しい構文は次のとおりです。
for (Iterator it = ...; it.hasNext(); ){
//...
}
(コード内の先行宣言は不要、ならびにループ見出しのために余分なセミコロンである。)
この構文またはwhile
ループを使用するかどうかは、両方のとまったく同じに翻訳し、好みの問題です。ループのための一般的な構文は次のとおりです。
for (<init stmt>; <loop cond>; <iterate stmt>) { <body>; }
これに相当します:
<init stmt>;
while (<loop cond>) { <body>; <iterate stmt>; }
の編集の実は、上記の二つの形式が完全に同等ではありませんが、の場合の変数は、INIT文で宣言されている(問題のように)。この場合、反復子変数の範囲に差が存在するであろう。 forループで、範囲は(宣言は、ループ外であるので、無大きな驚き)whileループの場合には、しかし、スコープは、外側のブロックの端まで延び、ループ自体に制限されています。
:他には、Javaの新しいバージョンでは、指摘したように、また、forループのための簡単な表記法があります
for (Iterator<Foo> it = myIterable.iterator(); it.hasNext(); ) {
Foo foo = it.next();
//...
}
のように書くことができます:
for (Foo foo : myIterable) {
//...
}
このフォームでは、当然のあなたが反復しながら、コレクションから項目を削除したい場合は、例えば、必要なイテレータ、への直接参照を失います。
他のヒント
これは単なるスタイルのことだとインデックスを持つものを使用しているときのように、私は、forループを好みます。あなたは、Java 5を使用している場合には、当然のことながら、とにかくコレクションのforeachループを使用する必要があります:
Collection<String> someCollection = someCollectionOfString();
for (String element : someCollection) {
....
}
forループ内Iterator
を宣言する目的は、のグッドプラクティスである、あなたの変数の範囲を最小限に抑えます。
Iterator
を宣言すると、ループが完了した後、、その後、参照がまだ生きて/有効です。時間の99.99%は、ループが完了するとIterator
を引き続き使用する必要はありませんので、このようなスタイルは、このようなバグにつながることができます:
//iterate over first collection
Iterator it1 = collection1.iterator();
while(it1.hasNext()) {
//blah blah
}
//iterate over second collection
Iterator it2 = collection2.iterator();
while(it1.hasNext()) {
//oops copy and paste error! it1 has no more elements at this point
}
最初のループの後it
の値を記憶以外の2つのメソッド間の大きな違いはありません。あなたがループ内で変数を再宣言ので、第二のアプローチは、おそらく、エラーをスローします。
この、aswellの第三の方法は、実際にあります。代わりに、例えばを書いてます。
for (Iterator<SomeObject> it = foo.iterator(); it.hasNext();) {
SomeObject so = foo.next();
}
あなたが最も頻繁に書くことができます。
for (SomeObject so: foo) {...}
と同じことに等しいこれらの2 ...
人々はそれが彼らにきれいに感じているという理由だけで、ループの明示的な(「古いスタイル」)を使用することができ、おそらく彼らは(私は個人的に多くのクリーナーであると考えている)まだ新しい構文に調整されていない。
長いループための構築物の一つの実際の具体的な利点は、あなたがイテレータへの参照を持っているので、他の後、next()
その上にメソッドを呼び出すことができるということです。特に、hasNext()
はしばしば呼び出すすると便利です - あなたは文字列のリストを印刷したい場合を想像カンマ区切ります:
StringBuilder sb = new StringBuilder();
for (Iterator it=...; it.hasNext();){
sb.append(it.next());
if (it.hasNext())
sb.append(", ");
}
それはあなたがより冗長ループの使用している場合、このような場合、「これが最後の1が」区別するだけです。