【问题标题】:StringTokenizer.countTokens() returning erroneous value in for loop conditionStringTokenizer.countTokens() 在 for 循环条件下返回错误值
【发布时间】:2014-06-27 06:41:40
【问题描述】:

我们必须计算具有多个“this”子字符串的给定字符串中“this”的数量。例如。 “你好,这是一个新兵,这是一个老兵,这是这个” 将返回 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。WHY??

注意:使用 JavaSE-1.6

【问题讨论】:

  • 您是否调试并检查了正在执行的内容?
  • 是的,我已经使用 print 语句进行了调试,因为我是新手
  • 来自JavaDoc for StringTokenizer; StringTokenizer 是一个遗留类,出于兼容性原因保留,但不鼓励在新代码中使用它。 不要使用它。
  • 你能给我们一个你的代码的最小可执行示例吗?
  • @Jens 是的,请使用此链接:pastie.org/9329551

标签: java for-loop stringtokenizer


【解决方案1】:

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

Per the javadoc

计算在生成异常之前可以调用此标记器的 nextToken 方法的次数。当前位置未提前。

这意味着每次您拨打nextToken()countTokens()都会改变

用你的例子:

  1. 对于 i=0,countTokens=4 -> 进入循环 -> 调用 nextToken() -> countTokens=3
  2. 对于 i=1,countTokens=3 -> 进入循环 -> 调用 nextToken() -> countTokens=2
  3. 对于 i=2,countTokens=2 -> 退出循环

【讨论】:

    【解决方案2】:

    那是因为当您执行 stringTokenizer1.nextToken() 时,您正在更改标记器的状态,并且您将少一个可读取的标记。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 2016-08-23
      • 2011-11-25
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多