460 Stimmen

Was ist der einfachste/beste/richtigste Weg, um durch die Zeichen einer Zeichenkette in Java zu iterieren?

Es gibt einige Möglichkeiten, in Java durch die Zeichen einer Zeichenkette zu iterieren:

  1. Verwendung von StringTokenizer ?
  2. Umwandlung der String zu einer char[] und die Iteration darüber.

Was ist der einfachste/beste/richtigste Weg, um zu iterieren?

21voto

Bruno De Fraine Punkte 42481

Es gibt einige spezielle Klassen für diesen Bereich:

import java.text.*;

final CharacterIterator it = new StringCharacterIterator(s);
for(char c = it.first(); c != CharacterIterator.DONE; c = it.next()) {
   // process c
   ...
}

19voto

Touko Punkte 10819

Wenn Sie eine Guave in Ihrem Klassenpfad zu finden ist, ist das Folgende eine gut lesbare Alternative. Guava hat sogar eine ziemlich vernünftige eigene List-Implementierung für diesen Fall, so dass dies nicht ineffizient sein sollte.

for(char c : Lists.charactersOf(yourString)) {
    // Do whatever you want     
}

UPDATE: Wie @Alex bemerkte, gibt es mit Java 8 auch CharSequence#chars zu verwenden. Auch der Typ ist IntStream, so dass er auf Zeichen wie abgebildet werden kann:

yourString.chars()
        .mapToObj(c -> Character.valueOf((char) c))
        .forEach(c -> System.out.println(c)); // Or whatever you want

14voto

Wenn Sie durch die Codepunkte einer String (siehe diese Antwort ) eine kürzere / lesbarere Methode ist die Verwendung der CharSequence#codePoints Methode in Java 8 hinzugefügt:

for(int c : string.codePoints().toArray()){
    ...
}

oder die direkte Verwendung des Datenstroms anstelle einer for-Schleife:

string.codePoints().forEach(c -> ...);

Außerdem gibt es CharSequence#chars wenn Sie einen Stream der Zeichen wünschen (obwohl es sich um eine IntStream da es keine CharStream ).

4voto

Enyby Punkte 3757

Wenn Sie Leistung brauchen, dann brauchen Sie muss testen in Ihrer Umgebung. Keine andere Möglichkeit.

Hier ein Beispielcode:

int tmp = 0;
String s = new String(new byte[64*1024]);
{
    long st = System.nanoTime();
    for(int i = 0, n = s.length(); i < n; i++) {
        tmp += s.charAt(i);
    }
    st = System.nanoTime() - st;
    System.out.println("1 " + st);
}

{
    long st = System.nanoTime();
    char[] ch = s.toCharArray();
    for(int i = 0, n = ch.length; i < n; i++) {
        tmp += ch[i];
    }
    st = System.nanoTime() - st;
    System.out.println("2 " + st);
}
{
    long st = System.nanoTime();
    for(char c : s.toCharArray()) {
        tmp += c;
    }
    st = System.nanoTime() - st;
    System.out.println("3 " + st);
}
System.out.println("" + tmp);

Auf Java online Ich verstehe:

1 10349420
2 526130
3 484200
0

Unter Android x86 API 17 erhalte ich:

1 9122107
2 13486911
3 12700778
0

3voto

Alan Punkte 7006

Ich würde nicht verwenden StringTokenizer da sie eine der Klassen im JDK ist, die vererbt wird.

Die Javadoc sagt:

StringTokenizer ist eine Legacy-Klasse, die aus Kompatibilitätsgründen beibehalten wird beibehalten wird, obwohl von ihrer Verwendung in neuem Code abgeraten wird. Es wird empfohlen, dass jeder die diese Funktionalität benötigen, die Split-Methode von String oder die java.util.regex stattdessen das Paket.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X