Ich möchte also für jedes Zeichen in einer Zeichenfolge iterieren.
Also dachte ich:
for (char c : "xyz")
aber ich bekomme einen Compilerfehler:
MyClass.java:20: foreach not applicable to expression type
Wie kann ich das machen?
Der einfachste Weg für jeden char
in einem String
ist toCharArray()
:
for (char ch: "xyz".toCharArray()) {
}
Dies gibt Ihnen die Prägnanz für jedes Konstrukt, muss aber leider String
(was unveränderlich ist) eine defensive Kopie ausführen, um das char[]
(was veränderlich ist) zu generieren , so dass es einige Kostenstrafen gibt.
Aus der Dokumentation :
[
toCharArray()
gibt] ein neu zugewiesenes Zeichenarray zurück, dessen Länge der Länge dieser Zeichenfolge entspricht und dessen Inhalt so initialisiert wird, dass er die durch diese Zeichenfolge dargestellte Zeichenfolge enthält.
Es gibt ausführlichere Möglichkeiten, Zeichen in einem Array zu durchlaufen (regulär für Schleife CharacterIterator
usw.), aber wenn Sie bereit sind, die Kosten dafür zu zahlen, toCharArray()
ist jede die prägnanteste.
toCharArray( )
3 mal aufgerufen?211900000
Zeit bis zur Fertigstellungfor (char c : str.toCharArray()) { }
~ 250 ms und die Zeit bis zur Fertigstellungfor (char c : charArray) { }
< 10 ms . Natürlich hängen diese Zeitwerte von der Hardware ab, aber zum Mitnehmen ist, dass eine Methode erheblich teurer ist als die andere.toCharArray()
befindet sich nicht im Loop-Body. Es wird nur einmal aufgerufen, und dann durchläuft die Schleife das resultierende Array. (Die for-each-Schleife unterscheidet sich von der allgemeinenfor
-schleife, die die Stoppbedingung bei jeder Iteration auswertet.)quelle
Eine weitere nützliche Lösung ist, dass Sie mit dieser Zeichenfolge als Array von Zeichenfolgen arbeiten können
quelle
split()
mehr als einem Java-Zeichen zugeordnet sind, was bei fast allen Emoticons der Fall ist. Zum Beispiel wird diese Variation Ihres Beispiels vier statt drei Malfor (String s : "x😁z".split("")) { System.out.println(s); }
Sie müssen das String-Objekt mit der
toCharArray
() -Methode der String-Klasse in ein Array von char konvertieren :quelle
In Java 8 können wir es lösen als:
Die Methode chars () gibt ein
IntStream
wie in doc erwähnt zurück :Warum verwenden
forEachOrdered
und nichtforEach
?Das Verhalten von
forEach
ist explizit nicht deterministisch, wenn dasforEachOrdered
eine Aktion für jedes Element dieses Streams in der Begegnungsreihenfolge des Streams ausführt, wenn der Stream eine definierte Begegnungsreihenfolge hat. DiesforEach
garantiert nicht, dass die Bestellung beibehalten wird. Überprüfen Sie auch diese Frage für mehr.Wir könnten auch
codePoints()
zum Drucken verwenden. Weitere Informationen finden Sie in dieser Antwort .quelle
Leider macht Java keine
String
ImplementierungIterable<Character>
. Dies könnte leicht getan werden. Es gibtStringCharacterIterator
aber das implementiert nicht einmalIterator
... Also mach dein eigenes:Jetzt können Sie (etwas) leicht laufen
for (char c : new CharSequenceCharacterIterable("xyz"))
...quelle
Wenn Sie Java 8 verwenden, können Sie
chars()
a verwendenString
, um einStream
Zeichen zu erhalten, aber Sie müssen dasint
Zurück zu a setzen,char
wennchars()
ein zurückgegeben wirdIntStream
.Wenn Sie Java 8 mit Eclipse-Sammlungen verwenden , können Sie die
CharAdapter
KlassenmethodeforEach
mit einem Lambda oder einer Methodenreferenz verwenden, um alle Zeichen in a zu durchlaufenString
.In diesem speziellen Beispiel könnte auch eine Methodenreferenz verwendet werden.
Hinweis: Ich bin ein Committer für Eclipse-Sammlungen.
quelle
In diesem Fall können Sie auch ein Lambda verwenden.
quelle
Für Travers kann ein String auch
charAt()
mit dem String verwendet werden.mögen :
charAt()
ist eine Methode zur Behandlung von Zeichenfolgen in Java, mit deren Hilfe die Zeichenfolge für ein bestimmtes Zeichen durchlaufen werden kann.quelle
for (char st: "xyz".toCharArray()) {}
ist?