Je possède ce code:Pourquoi StringTokenizer.hasMoreTokens renvoie-t-il true lorsqu'il ne l'est pas?
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++));
}
Où delimiter
est ;
et la ligne est 0.6245
. Pourquoi est-ce que je me retrouve avec un ArrayList
labels
qui a son deuxième élément c1
? Alors que la documentation dit:
Teste s'il y a plus de jetons disponibles à partir de cette chaîne de jetons. Si cette méthode renvoie true, un appel ultérieur à nextToken sans argument retournera un jeton.
Retours:
vrai si et seulement s'il y a au moins un jeton dans la chaîne après la position actuelle; false sinon.
Puisque la valeur: 0.6245
ne peut pas être divisé par delimiter ;
pourquoi serait-hasMoreTokens()
retour true
?
EDIT:
Je comprends maintenant pourquoi exécuter au moins une fois de boucle obtenir while
. C'est parce que c'est ainsi que fonctionne le StringTokenizer
. Plutôt que le split
normal que je suis habitué à où je peux accéder à n'importe quelle position du array
résultant, ici la seule manière d'accéder aux éléments est avec la méthode nextElement()
. Ce qui signifie que même s'il n'y a qu'un seul élément dans le StringTokenizer
, il retournera toujours true
de hasMoreTokens()
.
La raison pour laquelle je m'interroge sur StringTokenizer
qui est ce que j'ai appris une classe d'héritage est que j'examine un ancien code que je suis sur le point de réutiliser.
Imprimez les jetons et vérifiez si les valeurs sont correctes. –
Vous devriez lire un peu plus de la documentation: * "Un jeton est une séquence maximale de caractères consécutifs qui ne sont pas des délimiteurs" *. Donc, si le délimiteur ne peut pas être trouvé, alors toute la chaîne fournie est un jeton. (La même chose s'applique à 'String # split', au cas où vous aimeriez l'utiliser à la place) – Tom
Aussi _StringTokenizer est une classe héritée qui est conservée pour * raisons de compatibilité bien que son utilisation soit déconseillée dans le nouveau code.Il est * recommandé que Quelqu'un qui recherche cette fonctionnalité utilise la méthode split * à la place du paquet java.util.regex._ – zencv