当在while循环和for循环中使用StringTokenizer时为何给出不同的输出?

问题描述 投票:1回答:3

我使用StringTokenizer获取字符串的标记。但是,当我尝试使用for循环和while循环打印StringTokenizer中的所有标记时,会得到两个不同的输出。

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

当我尝试使用for循环打印所有令牌时

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

输出

她是一个迷人的女孩

当我尝试使用while循环打印所有令牌时

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

输出

她是一个迷人的女孩

不是吗?

我想知道为什么while循环给出了预期的两个标记,而for循环却没有给出这两个标记。

java stringtokenizer
3个回答
2
投票

countTokens()值在您调用nextToken()时减小。在第一次运行中,countTokens()为找到的两个条目返回2。首次呼叫nextToken()时,此号码将减少为1,因为仅剩一个条目可供读取。但这意味着for循环将导致

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

并且for循环变量i已处于值1。因此,由于1<1false,因此您的for循环将终止,而不会读取第二个条目。

您可以先将标记的数量保存在变量中,然后在for循环中使用它。

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

这样,countTokens()方法仅被调用一次(具有正确的值),而不会在每次nextToken()调用之后被调用,且剩余令牌计数减少。


0
投票

您忘记了for循环语法:

for(A;B;C) {}

其中:

  • A在循环开始时仅计算一次;
  • [B,C被计算一次每次新迭代

正确的方法是:

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

-4
投票

要获得输出,您应该以这种方式使用for循环:

for (int i=0; i <= stringTokenizer.countTokens(); i++)
  System.out.println(stringTokenizer.nextToken());
© www.soinside.com 2019 - 2024. All rights reserved.