Невозможно получить все элементы токена с помощью StringTokenizer


Я пытаюсь разделить строку на", " С помощью StringTokenizer, но не в состоянии получить целые значения, счетчик токенов показывает 3, но печатает только два элемента, я добавил свой код ниже если я пробовал с двумя другими входами "Рави, Тути, 786" - тот же вывод "Рави, Тути, 786, пинкод" получение трех жетонов не последний

public class Tokenizer{
public static void main(String[] args){
String str = "Ravi,Tuti,786";//survival of fittest,journey to get job,update skill,try,get job";
        StringTokenizer stk = new StringTokenizer(str,",");
        System.out.println(stk.countTokens());
        for(int i=0;i<=stk.countTokens();i++){
        System.out.println(stk.nextToken());}
}
}

Выход -

3
Ravi
Tuti
3 3

3 ответа:

Использовать hasMoreTokens() с nextToken:

public class Tokenizer{
    public static void main(String[] args){
    String str = "Ravi,Tuti,786";//survival of fittest,journey to get job,update skill,try,get job";
     StringTokenizer stk = new StringTokenizer(str,",");
     System.out.println(stk.countTokens());

     while (stk.hasMoreTokens()) {
        System.out.println(stk.nextToken());
     }

   }
}

Проблема с вашим подходом заключается в том, что вы запускаете countTokens в цикле for, который изменяется после вызова nextToken.

Если вы хотите использовать цикл for, вам нужно сохранить количество маркеров в переменной:

int numTokens = stk.countTokens();
for (int i = 0; i < numTokens; i++) {
  System.out.println(stk.nextToken());
}

Вы должны использовать метод hasTokens().

for( ; stk.hasMoreTokens() ; ) {
    System.out.println(stk.nextToken());
}

Метод countTokens() возвращает:

Количество токенов, оставшихся в строке с использованием текущего набора разделителей.

Поэтому в вашем цикле if он продолжает получать оценки и возвращать меньшие числа. Чтобы предотвратить это, вы можете разрешить его в переменную

int length = stk.countTokens();
for(int i=0;i<length;i++){
    System.out.println(stk.nextToken());
}

Если вы не хотите вводить другую переменную, вы можете начать i с того, что countTokens() возвращает, а затем замкнуть цикл до тех пор, пока i не станет больше нуля (при вычитании из i вместо добавление)

for(int i=stk.countTokens();i>0;i--){
    System.out.println(stk.nextToken());
}

Вывод:

3
Ravi
Tuti
786