Frage

sehe ich oft Code wie:

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

, aber ich schreibe, dass (wenn Java 1.5 nicht verfügbar ist oder für jede kann nicht verwendet werden), wie:

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

da

  • Es ist kürzer
  • Es hält i in einem kleineren Umfang
  • Es verringert die Chance der Verwirrung. (Ist i außerhalb der verwendete während? Wo ist i erklärt?)

Ich denke, Code sollte so einfach wie möglich zu verstehen, so dass ich nur komplexen Code zu tun, komplexe Dinge zu machen. Was denkst du? Was ist besser?

Von: http://jamesjava.blogspot.com/2006/04/iterating. html

War es hilfreich?

Lösung

Ich ziehe die for-Schleife, da sie auch den Umfang des Iterator setzen nur das for-Schleife.

Andere Tipps

Es gibt geeignete Verwendungen für die Zeit, die für und die foreach-Konstrukte:

  • while - Verwenden Sie diese Option, wenn Sie iterieren und der entscheidende Faktor für Looping oder nicht basiert lediglich auf einer Bedingung. nur zweitrangig in dieser Schleife Konstrukt wird einen Index zu halten; alles sollte auf den Zustand basieren

  • for - Verwenden Sie diese Option, wenn Sie Looping und das primäre Anliegen ist der Index des Arrays / Sammlung / Liste. Es ist nützlicher, ein zu verwenden, wenn Sie am ehesten alle die Elemente ohnehin zu durchlaufen, und in einer bestimmten Reihenfolge (zB rückwärts durch eine sortierte Liste, zum Beispiel).

  • foreach - Verwenden Sie diese Option, wenn Sie nur durch Ihre Sammlung gehen müssen unabhängig von der Reihenfolge

  • .

Natürlich gibt es Ausnahmen von den oben genannten, aber das ist die allgemeine Regel, die ich verwende, wenn die verwenden entscheiden. Davon abgesehen Ich neige dazu, foreach zu verwenden häufiger.

Warum nicht verwenden Sie die for-each konstruieren? (Ich habe Java eine Weile nicht benutzt, aber das gibt es in C # und ich bin ziemlich sicher, dass Java 1.5 auch dies hat):

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

Ich denke Umfang das größte Problem ist hier, wie Sie darauf hingewiesen haben.

In der „while“ Beispiel wird der Iterator außerhalb der Schleife deklariert, so wird es weiterhin geben, nachdem die Schleife erfolgt. Dies kann Probleme verursachen, wenn diese gleiche Iterator zu einem späteren Zeitpunkt wieder verwendet wird. Z.B. Sie können vergessen, es zu initialisieren, bevor es in einer anderen Schleife verwendet wird.

In der „für“ Beispiel der Iterator innerhalb der Schleife deklariert wird, so dass ihr Anwendungsbereich auf der Schleife begrenzt ist. Wenn Sie versuchen, es nach der Schleife zu verwenden, erhalten Sie einen Compiler-Fehler.

Wenn Sie nur den Iterator einmal verwenden gehen und wirft es weg, ist die zweite Form bevorzugt; sonst müssen Sie das erste Formular

IMHO, die für Schleife ist weniger lesbar in diesem Szenario, wenn Sie an diesem Code aus der Perspektive der englischen Sprache zu suchen. Ich arbeite an einem Code, in dem Autor Missbrauch hat für Schleife, und es ist nicht schön. Vergleichen Sie folgendermaßen vor:

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

vs

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

Ich würde zustimmen, dass die „für“ Schleife ist klarer und besser geeignet, wenn das Iterieren.

Die „while“ -Schleife zur Abfrage geeignet ist, oder wenn die Anzahl der Schleifen Austrittsbedingung erfüllt wird innerhalb der Schleife basierend auf Aktivitätsänderung.

Nicht, dass es wichtig ist wahrscheinlich in diesem Fall aber Compiler, VMs und CPU ist normalerweise spezielle Optimierungstechniken sie Benutzer unter der Haube, die für Schleifen Leistung besser (und in naher Zukunft parallel) in der Regel machen sie es nicht tun tun, dass mit While-Schleifen (weil sein schwerer zu bestimmen, wie es wird tatsächlich ausgeführt wird). Aber in den meisten Fällen Code Klarheit sollte Trumpf-Optimierung.

for-Schleife Sie mit einer einzigen Variablen arbeiten können, da sie den Umfang der Variable für einen aktuellen Arbeits for-Schleife nur setzt. Dies ist jedoch nicht möglich, in while-Schleife . Zum Beispiel:
int i; for (i = 0; in1; i ++) etwas tun ..

for (i = 0; i n2; i + = 2) etwas tun.

So nach dem 1. Schleife i = N1-1 am Ende. Aber während die zweite Schleife verwenden, können Sie i eingestellt wieder auf 0.   Doch

int i = 0;

while (i weniger als Grenze) {etwas tun ..; i ++; }

Daher wird i eingestellt am Ende zu begrenzen-1. So können nicht Sie gleichen i in einer anderen while-Schleife verwenden.

Entweder ist in Ordnung. Ich benutze für () mich selbst, und ich weiß nicht, ob es Probleme gibt kompilieren. Ich vermute, dass sie beide so ziemlich die gleiche Sache optimieren nach unten gehen.

Ich bin damit einverstanden, dass sollte die for-Schleife, wann immer möglich verwendet werden, aber manchmal gibt es komplexere Logik, die den Iterator im Körper der Schleife steuert. In diesem Fall müssen Sie mit, während gehen.

Ich war die for-Schleife für Klarheit. Während ich die while-Schleife , wenn sie mit einem gewissen undeterministic Zustand gegenüber.

Beide sind in Ordnung, aber denken Sie daran, dass manchmal auf den Iterator Zugriff direkt nützlich ist (wie zum Beispiel, wenn Sie Elemente zu entfernen, die eine bestimmte Bedingung erfüllen - Sie erhalten eine ConcurrentModificationException, wenn man Collection.remove (o) innerhalb eines tun für ( T o: collection) loop)

.

Ich bevorzuge zu schreiben (bla: bla) [foreach] Syntax fast die ganze Zeit, weil es natürlich lesbar mir scheint. Das Konzept der Iteratoren im Allgemeinen nicht wirklich Parallelen hat außerhalb der Programmierung

Academia neigt dazu, die while-Schleife zu bevorzugen, da es für weniger komplizierte Argumentation über Programme macht. Ich neige dazu, die for- oder foreach-Schleifen-Strukturen bevorzugen, da sie für sehr viel einfacher zu lesen Code zu machen.

Obwohl beide sehr fein sind, neige ich dazu, das erste Beispiel zu verwenden, da es einfacher ist, zu lesen.

Es gibt weniger Operationen in jeder Zeile mit der while () Schleife geschehen, wird der Code einfacher für jemanden, um neu, um den Code zu verstehen, was los ist.

Diese Art der Konstruktion erlaubt es mich auch zu einer Gruppe Initialisierungen in einer gemeinsamen Stelle (an der Spitze des Verfahrens), die auch für mich erleichtert zu kommentieren, und Konzeptualisierung für jemanden, den es zum ersten Mal zu lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top