Ich habe diesen Code:Warum gibt StringTokenizer.hasMoreTokens true zurück, wenn dies nicht der Fall ist?
StringTokenizer st = new StringTokenizer (line, String.valueOf(delimiter));
labels.add("Time");
int currentCol = 1;
while (st.hasMoreTokens())
{
st.nextToken();
labels.add(new String("c" + currentCol++));
}
Wo delimiter
;
und Linie ist 0.6245
.
Warum habe ich am Ende ein ArrayList
labels
, das hat sein zweites Element c1
? Während die Dokumentation lautet:
Testet, ob mehr Tokens aus der Zeichenfolge dieses Tokenizers verfügbar sind. Wenn diese Methode true zurückgibt, wird ein nachfolgender Aufruf von nextToken ohne Argument erfolgreich ein Token zurückgeben.
Returns:
wahr, wenn und nur wenn mindestens ein Token in der Zeichenfolge nach der aktuellen Position ist; falsch sonst.
Seit Wert: 0.6245
nicht durch Trennzeichen aufgeteilt werden ;
warum sollte hasMoreTokens()
Rückkehr true
?
EDIT:
Jetzt verstehe ich, warum while
Schleife des bekommen mindestens einmal auszuführen. Es ist, weil das StringTokenizer
funktioniert. Eher als regulär split
, die ich gewohnt bin, wo ich auf jede Position des resultierenden array
zugreifen kann, ist hier die einzige Möglichkeit, auf Elemente zuzugreifen, mit der Methode nextElement()
. Das bedeutet, dass selbst wenn nur ein Element in StringTokenizer
vorhanden ist, es immer true
von hasMoreTokens()
zurückgibt.
Der Grund, warum ich mich wundere über StringTokenizer
, was ich eine Legacy-Klasse gelernt habe, ist, dass ich einen alten Code überprüfe, den ich wiederverwenden werde.
Drucken Sie die Tokens und prüfen Sie, ob es die richtigen Werte sind. –
Sie sollten ein wenig mehr aus der Dokumentation lesen: * "Ein Token ist eine maximale Folge von aufeinander folgenden Zeichen, die keine Trennzeichen sind" *. Wenn der Begrenzer nicht gefunden werden kann, ist die gesamte angegebene Zeichenfolge ein Token. (Dasselbe gilt für 'String # split'; falls Sie das stattdessen verwenden möchten) – Tom
Auch _StringTokenizer ist eine Legacy-Klasse, die für * Kompatibilitätsgründe beibehalten wird, obwohl ihre Verwendung in neuem Code verhindert wird. Es ist * empfohlen, dass Wer diese Funktion sucht, benutzt stattdessen die Split-Methode * von Stringor und das Paket java.util.regex._ – zencv