Versuchen Sie , tatsächlich die Verwendung eines Iterators zu vermeiden, oder wollen Sie einfach nicht in der sehen Quelle Code?
Jon Skeet
2
Sie können den Code kürzer und sauberer machen, müssen jedoch einen Iterator verwenden. Gibt es einen Grund, warum Sie dies vermeiden möchten?
Peter Lawrey
5
Nur zur Veranschaulichung und als Erklärung, warum der Iterator vermieden werden sollte: Ich bin derzeit mit diesem Problem in einem in Java geschriebenen Android-Spiel konfrontiert. Im Moment verwende ich ein HashSet zum Speichern von Listenern, die regelmäßig über Ereignisse benachrichtigt werden müssen. Das wiederholte Iterieren von Sammlungen führt jedoch zu einer starken Garbage Collector-Aktivität, die die Spielschleife belasten kann. Und das ist ein No-Go in einem Java-Spiel. Ich werde diese Teile umschreiben.
Tiguchi
12
@thecoshman Ich spreche nur aus der Perspektive der Java-Spieleentwicklung, bei der Sie GC bei regelmäßigen Aktualisierungen des Spielstatus um jeden Preis vermeiden möchten. Iteratoren sind nur vorübergehend nützliche Objekte, da Sie sie nicht auf den Start zurücksetzen können. Daher werden sie bei jedem Aufruf der Iterationsmethode neu erstellt (siehe z. B. ArrayList.java-Quelle). Wenn Sie in einer Spielschleife zum Iterieren von Szenenobjekten und unter Berücksichtigung von mindestens 30 Aktualisierungen pro Sekunde verwendet werden, erhalten Sie mindestens 60 (Szene wird normalerweise zweimal pro Zyklus iteriert) Iteratorobjekte pro Sekunde im Speicher, die auf GC warten. Das hat einen großen Einfluss auf Android.
Tiguchi
9
Vielleicht sollte man in diesem Fall eine adäquatere Datenstruktur wählen? Ein Set ist nicht dafür ausgelegt, effizient zu iterieren. Warum nicht eine ArrayList verwenden und mit einer Standard-for-Schleife darüber iterieren? Es werden keine zusätzlichen Iteratoren erstellt, der Lesezugriff ist sehr schnell.
Ich glaube, dies verwendet einen Iterator hinter den Kulissen.
Munyengm
22
@ Munyengm Ja, das tut es. Es gibt keine Möglichkeit, über einen Satz ohne Iterator zu iterieren, außer auf die zugrunde liegende Struktur zuzugreifen, die die Daten durch Reflexion enthält, und den von Set #
iterator
1
Das funktioniert, aber wenn es Probleme geben könnte, dann ist es nicht die Lösung für mich. Ich denke, ich habe keine Wahl, ich muss Iterator verwenden. Trotzdem danke für alles.
user1621988
39
@ user1621988 Welche Probleme? Es gibt keine Probleme mit dem von mir bereitgestellten Code. Es bietet nur eine schöne und saubere Möglichkeit, über einen Satz zu iterieren, ohne explizit einen Iterator verwenden zu müssen.
Assylias
90
Es gibt mindestens sechs zusätzliche Möglichkeiten, einen Satz zu durchlaufen. Folgendes ist mir bekannt:
Methode 1
// Obsolete CollectionEnumeration e =newVector(movies).elements();while(e.hasMoreElements()){System.out.println(e.nextElement());}
Methode 2
for(String movie : movies){System.out.println(movie);}
Methode 3
String[] movieArray = movies.toArray(newString[movies.size()]);for(int i =0; i < movieArray.length; i++){System.out.println(movieArray[i]);}
Methode 4
// Supported in Java 8 and above
movies.stream().forEach((movie)->{System.out.println(movie);});
Methode 5
// Supported in Java 8 and above
movies.stream().forEach(movie ->System.out.println(movie));
Methode 6
// Supported in Java 8 and above
movies.stream().forEach(System.out::println);
Dies ist das, HashSetwas ich für meine Beispiele verwendet habe:
Set<String> movies =newHashSet<>();
movies.add("Avatar");
movies.add("The Lord of the Rings");
movies.add("Titanic");
Die for-Anweisung verfügt über ein Formular, das für die Iteration durch Sammlungen und Arrays entwickelt wurde. Dieses Formular wird manchmal als erweiterte for-Anweisung bezeichnet und kann verwendet werden, um Ihre Schleifen kompakter und leichter lesbar zu machen.
defaultvoid forEach(Consumer<?super T> action)Performs the given action for each element of the Iterable until all elements have been processed or the action throws an exception.Unless otherwise specified by the implementing class, actions are performed in the order of iteration (if an iteration order is specified).Exceptions thrown by the action are relayed to the caller.ImplementationRequirements:Thedefault implementation behaves as if:for(T t :this)
action.accept(t);Parameters: action -The action to be performed for each elementThrows:NullPointerException-if the specified action is nullSince:1.8
Hierfür gibt es jedoch bereits sehr gute Antworten. Hier ist meine Antwort:
1. set.stream().forEach(System.out::println);// It simply uses stream to display set values2. set.forEach(System.out::println);// It uses Enhanced forEach to display set values
Wenn es sich bei diesem Satz um einen benutzerdefinierten Klassentyp handelt, z. B.: Kunde.
Antworten:
Sie können eine erweiterte for-Schleife verwenden :
Oder mit Java 8:
quelle
Es gibt mindestens sechs zusätzliche Möglichkeiten, einen Satz zu durchlaufen. Folgendes ist mir bekannt:
Methode 1
Methode 2
Methode 3
Methode 4
Methode 5
Methode 6
Dies ist das,
HashSet
was ich für meine Beispiele verwendet habe:quelle
stream()
.Das Konvertieren Ihres Sets in ein Array kann Ihnen auch beim Durchlaufen der Elemente helfen:
quelle
toArray
den Iterator des Sets auf.Betrachten Sie zur Demonstration den folgenden Satz, der verschiedene Personenobjekte enthält:
quelle
Sie können die Funktionsoperation für einen übersichtlicheren Code verwenden
quelle
Hier sind einige Tipps, wie Sie ein Set zusammen mit ihren Leistungen wiederholen können:
Der Code ist selbsterklärend.
Das Ergebnis der Dauer sind:
Wir können sehen, dass es am
Lambda
längsten dauert, währendIterator
es am schnellsten ist.quelle
Aufzählung(?):
Ein anderer Weg (java.util.Collections.enumeration ()):
Java 8:
oder
quelle
Hierfür gibt es jedoch bereits sehr gute Antworten. Hier ist meine Antwort:
Wenn es sich bei diesem Satz um einen benutzerdefinierten Klassentyp handelt, z. B.: Kunde.
// Kundenklasse:
quelle