我使用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循环却没有给出这两个标记。
countTokens()
值在您调用nextToken()
时减小。在第一次运行中,countTokens()
为找到的两个条目返回2
。首次呼叫nextToken()
时,此号码将减少为1
,因为仅剩一个条目可供读取。但这意味着for
循环将导致
for (int i=0; i<1; i++)
并且for
循环变量i
已处于值1
。因此,由于1<1
为false
,因此您的for
循环将终止,而不会读取第二个条目。
您可以先将标记的数量保存在变量中,然后在for
循环中使用它。
int count = stringTokenizer.countTokens();
for (int i=0; i<count; i++) {
System.out.println(stringTokenizer.nextToken());
}
这样,countTokens()
方法仅被调用一次(具有正确的值),而不会在每次nextToken()
调用之后被调用,且剩余令牌计数减少。
您忘记了for循环语法:
for(A;B;C) {}
其中:
正确的方法是:
for (int i = 0, total = stringTokenizer.countTokens(); i < total; i++)
System.out.println(stringTokenizer.nextToken());
要获得输出,您应该以这种方式使用for循环:
for (int i=0; i <= stringTokenizer.countTokens(); i++)
System.out.println(stringTokenizer.nextToken());