2016-05-28 4 views
1

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 ArrayListlabels, 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.

+0

Drucken Sie die Tokens und prüfen Sie, ob es die richtigen Werte sind. –

+1

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

+0

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

Antwort

1

Ihr Problem ist, weil Sie ein Element auf Ihrer Liste außerhalb der Schleife hinzufügen:

labels.add("Time"); 

Sie haben nur ein Token nach der tokenize arbeitet. Das ist, weil, wenn Sie einen String tokenize, die nicht das mitgeteilt hat Begrenzer Sie nur ein Element, also, wenn die Zeichenfolge ist 0.6245 es als Zeichen verstehen, wie (für Ihre Trennzeichen):

First token: 0.6245 
Second token: nothing 

wie es ist, wenn es : 0.6245;

Innerhalb der Schleife Sie eine andere Sache zu Ihrer Array-Liste hinzufügen:

labels.add(new String("c" + currentCol++)); 

da Sie currentCol als 1 und die while laufen wird initialisiert j Sobald es c1 als Wert auf dem zweiten Element Ihrer Liste hat (erinnern Sie sich, Sie haben eine vorher hinzugefügt)

Ich weiß nicht, was Sie versuchen zu erreichen.Aber es scheint, wie Sie wollen etwas, wie:

StringTokenizer st = new StringTokenizer (line, String.valueOf(delimiter)); 

//Don't add this: 
//labels.add("Time"); 

int currentCol = 1;             
while (st.hasMoreTokens()) 
{ 
    String someThing = st.nextToken(); 
    labels.add(new String("Current token:" + someThing 
        + "\n currentCol: " + currentCol++));         
} 
+0

Sie haben völlig Recht und danken Ihnen für Ihre Antwort. Ich habe mich nur gewundert, warum '' hasMoreTokens' 'wahr ist, wenn Sie, wie Sie sagten, ein zweites Token nichts ist? Es ist keine Do-While-Schleife ... und die Bedingung wurde nicht erfüllt. –

+0

Es ist nicht, dass es nichts zurückgibt, wenn es in die While-Schleife eintritt, ist es auf der ersten Position. Aber Ihre Liste "labels" in Ihrem Code hat bereits ein Element, also die 'c1' an zweiter Stelle. Wenn Sie 'st.nextToken()' nur dann aufrufen, bewegt es sich zu dem zweiten Element, das nicht existiert, so dass es die while-Funktion beendet, nachdem es beendet ist. –

+0

Aber wenn 'StringTokenizer' nur ein Element hat, warum' st.hasMoreTokens() '' '' 'zurückgibt? Vielleicht ist das das Standardverhalten, aber es macht keinen Sinn für mich, wenn es nur einen Token gibt, dann gibt es keine Token mehr ... Jedenfalls gebe ich dir +1, um mir das erklären zu wollen. –

2

0,6245 ist selbst ein Token obwohl Sie keine Trennzeichen haben. Wenn Sie so etwas haben würden "0.6245; 0.987" dann hat es 2 Token. Es sei denn, Ihre Zeile hat einen leeren Platz oder einen Nullwert while-Schleife wird mindestens einmal eingegeben.

+0

Sie erhalten 'NullPointerException', wenn' line' null ist, aber Sie haben Recht, dass leere Zeichenfolge keine Token zurückgibt. – Andreas

+0

ja richtig @Andreas. –

Verwandte Themen