Почему StringTokenizer дает разные выходы при использовании в течение времени l oop и цикл for - PullRequest
5 голосов
/ 26 марта 2020

Я использовал StringTokenizer, чтобы получить токены строки. Но я получаю два разных вывода, когда пытаюсь распечатать все токены в этом StringTokenizer, используя for-l oop и while-l oop.

String string="She is an attractive girl, isn't she?";
StringTokenizer stringTokenizer=new StringTokenizer(string,",");

, когда я пытался распечатать все токены, используя для l oop

for (int i=0;i<stringTokenizer.countTokens();i++)
  System.out.println(stringTokenizer.nextToken());

вывод

Она привлекательная девушка

, когда я пытался распечатать все токены, используя какое-то время l oop

while (stringTokenizer.hasMoreElements())
  System.out.println(stringTokenizer.nextToken());

вывод

Она привлекательная девушка

не она?

Я хочу знать, почему в то время как l oop дает ожидаемые два токена, а для l oop не дает два токена.

1 Ответ

6 голосов
/ 26 марта 2020

Значение countTokens() уменьшается при вызове nextToken(). При первом запуске countTokens() возвращает 2 для двух найденных записей. Когда вы звоните nextToken() в первый раз, этот номер уменьшается до 1, поскольку остается только одна запись для чтения. Но это означает, что for l oop приведет к

for (int i=0; i<1; i++)

, а переменная for l oop i уже имеет значение 1. Таким образом, поскольку 1<1 равно false, ваш for l oop завершается без чтения второй записи.

Сначала вы можете сохранить количество токенов в переменной, а затем использовать его в своем for l oop.

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

Таким образом, метод countTokens() вызывается только один раз (с правильным значением), а не после каждого вызова nextToken() с уменьшением количества оставшихся токенов.

...