42

次のようなコードをよく見かけます。

Iterator i = list.iterator();
while(i.hasNext()) {
    ...
}

しかし、私はそれを次のように書いています(Java 1.5が利用できない場合、またはfor eachが使用できない場合):

for(Iterator i = list.iterator(); i.hasNext(); ) {
    ...
}

なぜなら

  • 短いです
  • それはiより小さな範囲にとどまります
  • 混乱の可能性を減らします。( iwhile 外で使用されますか? どこでi宣言されますか?)

複雑なことを行うために複雑なコードを作成するだけで済むように、コードはできるだけ簡単に理解できるようにする必要があると思います。どう思いますか?どちらが良いですか?

から: http://jamesjava.blogspot.com/2006/04/iterating.html

4

15 に答える 15

83

for ループはイテレータのスコープを for ループだけに設定するので、私は for ループを好みます。

于 2008-09-19T03:07:42.993 に答える
12

while、for、および foreach コンストラクトには、適切な使用法があります。

  • while- 繰り返し処理を行っていて、ループするかどうかの決定要因が単に条件に基づいている場合に使用します。このループ構造では、インデックスを保持することは二次的な問題にすぎません。すべてが条件に基づいている必要があります

  • for- ループしていて、主な関心事が配列/コレクション/リストのインデックスである場合は、これを使用します。とにかくすべての要素を特定の順序で処理する可能性が最も高い場合 (たとえば、並べ替えられたリストを逆方向に処理する場合など)は、 for を使用する方が便利です。

  • foreach- 順序に関係なく、単にコレクションを確認する必要がある場合に使用します。

明らかに上記には例外がありますが、それは私がどちらを使用するかを決定する際に使用する一般的なルールです. そうは言っても、私はforeachより頻繁に使用する傾向があります。

于 2008-09-19T03:20:00.170 に答える
5

for-each コンストラクトを使用しないのはなぜですか? (私はしばらく Java を使用していませんが、これは C# に存在し、Java 1.5 にもこれがあると確信しています):

List<String> names = new ArrayList<String>();
names.add("a");
names.add("b");
names.add("c");

for (String name : names)
    System.out.println(name.charAt(0));
于 2008-09-19T03:09:39.540 に答える
4

ご指摘のとおり、スコープがここでの最大の問題だと思います。

「while」の例では、反復子はループの外側で宣言されているため、ループが終了した後も存在し続けます。この同じ反復子が後で再び使用されると、問題が発生する可能性があります。例)別のループで使用する前に初期化するのを忘れる場合があります。

「for」の例では、反復子はループ内で宣言されているため、そのスコープはループに限定されています。ループの後で使用しようとすると、コンパイラ エラーが発生します。

于 2008-09-19T03:13:23.603 に答える
2

イテレータを 1 回だけ使用して破棄する場合は、2 番目の形式が優先されます。それ以外の場合は、最初の形式を使用する必要があります

于 2008-09-19T03:08:30.620 に答える
2

IMHO、英語の観点からこのコードを見ると、このシナリオではforループが読みにくくなります。私は、作成者がforループを悪用するコードに取り組んでいますが、きれいではありません。以下を比較します。

for (; (currUserObjectIndex < _domainObjectReferences.Length) && (_domainObjectReferences[currUserObjectIndex].VisualIndex == index); ++currUserObjectIndex)
    ++currNumUserObjects;

while (currUserObjectIndex < _domainObjectReferences.Length && _domainObjectReferences[currUserObjectIndex].VisualIndex == index)
{
    ++currNumUserObjects;
    ++currUserObjectIndex;
}
于 2011-12-08T18:24:05.600 に答える
1

反復するときは、「for」ループの方が明確で適切であることに同意します。

「while」ループは、ポーリング、またはループ内のアクティビティに基づいて終了条件を満たすループの数が変化する場合に適しています。

于 2008-09-19T03:10:27.933 に答える
1

この場合、おそらく問題になるわけではありませんが、コンパイラ、VM、および CPU には、通常、for ループのパフォーマンスを向上させる (そして近い将来には並列化する) 特別な最適化手法が内部で使用されています。 while ループ (実際にどのように実行されるかを判断するのが難しいため)。しかし、ほとんどの場合、コードの明快さは最適化よりも重要です。

于 2008-09-19T03:30:25.950 に答える
0

どちらも問題ありませんが、Iterator への直接アクセスが役立つ場合があることを覚えておいてください (特定の条件に一致する要素を削除する場合など - for(T o :コレクション) ループ)。

私は for(blah : blah) [foreach] 構文を書くことを好みます。一般的な反復子の概念は、プログラミング以外では実際には類似点がありません。

于 2008-09-19T11:51:03.677 に答える
0

学界では、プログラムについての推論がより簡単になるため、while ループを好む傾向があります。コードを読みやすくするため、for または foreach ループ構造を好む傾向があります。

于 2008-09-19T12:02:35.430 に答える
0

どちらでも構いません。私は for () を自分で使用していますが、コンパイルの問題があるかどうかはわかりません。どちらもほとんど同じように最適化されていると思います。

于 2008-09-19T03:07:42.773 に答える
0

どちらも非常に優れていますが、最初の例の方が読みやすいため、私は最初の例を使用する傾向があります。

while() ループを使用すると、各行で発生する操作が少なくなり、コードに不慣れな人が何が起こっているのかを簡単に理解できるようになります。

このタイプの構成により、初期化を共通の場所 (メソッドの上部) にグループ化することもできます。これにより、コメントが簡単になり、初めてそれを読む人にとって概念化も容易になります。

于 2008-09-19T03:13:47.783 に答える
0

明確にするために、私は for ループでした。いくつかの不確定な状況に直面したとき、 while ループを使用します。

于 2008-09-19T03:24:37.057 に答える
0

可能な限り for ループを使用する必要があることに同意しますが、ループの本体で反復子を制御するより複雑なロジックが存在する場合があります。その場合は、while を使用する必要があります。

于 2008-09-19T03:15:47.123 に答える