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?
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?
Antworten:
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 Fertigstellung for (char c : str.toCharArray()) { }
~ 250 ms und die Zeit bis zur Fertigstellung for (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 allgemeinen for
-schleife, die die Stoppbedingung bei jeder Iteration auswertet.)
String s = "xyz";
for(int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
}
Eine weitere nützliche Lösung ist, dass Sie mit dieser Zeichenfolge als Array von Zeichenfolgen arbeiten können
for (String s : "xyz".split("")) {
System.out.println(s);
}
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 Mal for (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 :
String str = "xyz";
char arr[] = str.toCharArray(); // convert the String object to array of char
// iterate over the array using the for-each loop.
for(char c: arr){
System.out.println(c);
}
In Java 8 können wir es lösen als:
String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));
Die Methode chars () gibt ein IntStream
wie in doc erwähnt zurück :
Gibt einen Stream von int Null zurück, der die Zeichenwerte aus dieser Sequenz erweitert. Jedes Zeichen, das einem Ersatzcodepunkt zugeordnet ist, wird nicht interpretiert durchlaufen. Wenn die Sequenz während des Lesens des Streams mutiert ist, ist das Ergebnis undefiniert.
forEachOrdered
und nicht forEach
?Das Verhalten von forEach
ist explizit nicht deterministisch, wenn das forEachOrdered
eine Aktion für jedes Element dieses Streams in der Begegnungsreihenfolge des Streams ausführt, wenn der Stream eine definierte Begegnungsreihenfolge hat. Dies forEach
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 .
Leider macht Java keine String
Implementierung Iterable<Character>
. Dies könnte leicht getan werden. Es gibt StringCharacterIterator
aber das implementiert nicht einmal Iterator
... Also mach dein eigenes:
public class CharSequenceCharacterIterable implements Iterable<Character> {
private CharSequence cs;
public CharSequenceCharacterIterable(CharSequence cs) {
this.cs = cs;
}
@Override
public Iterator<Character> iterator() {
return new Iterator<Character>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < cs.length();
}
@Override
public Character next() {
return cs.charAt(index++);
}
};
}
}
Jetzt können Sie (etwas) leicht laufen for (char c : new CharSequenceCharacterIterable("xyz"))
...
Wenn Sie Java 8 verwenden, können Sie chars()
a verwenden String
, um ein Stream
Zeichen zu erhalten, aber Sie müssen das int
Zurück zu a setzen, char
wenn chars()
ein zurückgegeben wird IntStream
.
"xyz".chars().forEach(i -> System.out.print((char)i));
Wenn Sie Java 8 mit Eclipse-Sammlungen verwenden , können Sie die CharAdapter
Klassenmethode forEach
mit einem Lambda oder einer Methodenreferenz verwenden, um alle Zeichen in a zu durchlaufen String
.
Strings.asChars("xyz").forEach(c -> System.out.print(c));
In diesem speziellen Beispiel könnte auch eine Methodenreferenz verwendet werden.
Strings.asChars("xyz").forEach(System.out::print)
Hinweis: Ich bin ein Committer für Eclipse-Sammlungen.
In diesem Fall können Sie auch ein Lambda verwenden.
String s = "xyz";
IntStream.range(0, s.length()).forEach(i -> {
char c = s.charAt(i);
});
Für Travers kann ein String auch charAt()
mit dem String verwendet werden.
mögen :
String str = "xyz"; // given String
char st = str.charAt(0); // for example we take 0 index element
System.out.println(st); // print the char at 0 index
charAt()
ist eine Methode zur Behandlung von Zeichenfolgen in Java, mit deren Hilfe die Zeichenfolge für ein bestimmtes Zeichen durchlaufen werden kann.
for (char st: "xyz".toCharArray()) {}
ist?