StringTokenizer.countTokens()在for循环条件中返回错误值

时间:2014-06-27 06:41:40

标签: java for-loop stringtokenizer

我们必须计算"这个"在一个给定的字符串中有多个"这个"子。例如。 "你好,这是一名新兵,这是一名老将,这就是这个" 将返回4.

所以我正在使用:

    StringTokenizer stringTokenizer1 = new StringTokenizer(input2);
    ArrayList<String> arrayList1 = new ArrayList<String>();
    int count=0;
    int arrIndex = stringTokenizer1.countTokens();

    for (int i = 0; i < stringTokenizer1.countTokens(); i++) 
    {
        arrayList1.add(stringTokenizer1.nextToken());
    }

    for (String string2 : arrayList1) 
    {
        if (string2.equals(string)) 
        {
            count++;
        }
    }

    output1 = count;
    System.out.println(output1);

仅返回2.

但是,如果为int arrindex分配了stringTokenizer1.countTokens()的值并在循环条件中使用,则它会给出正确的结果4.为什么?

注意:使用JavaSE-1.6

2 个答案:

答案 0 :(得分:3)

那是因为当您正在执行stringTokenizer1.nextToken()时,您正在更改令牌化程序的状态,并且您将只剩下一个令牌来阅读。

答案 1 :(得分:3)

每次重新进入循环时都会评估条件stringTokenizer1.countTokens()

Per the javadoc

  

计算在生成异常之前可以调用此标记生成器的nextToken方法的次数。目前的立场没有提前。

这意味着每次拨打countTokens()

时,nextToken()都会发生变化

用你的例子:

  1. for i = 0,countTokens = 4 - &gt;进入循环 - &gt;致电nextToken() - &gt; countTokens = 3
  2. for i = 1,countTokens = 3 - &gt;进入循环 - &gt;致电nextToken() - &gt; countTokens = 2
  3. for i = 2,countTokens = 2 - &gt;退出循环