【问题标题】:countTokens() always returns 1 with user inputcountTokens() 在用户输入时总是返回 1
【发布时间】:2016-07-22 17:31:18
【问题描述】:

在我们开始之前,我不认为这是一个重复的问题。我已经阅读了题为StringTokenzer countTokens() returns 1 with any string 的问题,但这并没有解决正确分隔的字符串被正确计数的事实,但正确分隔的输入却不是。

在使用 StringTokenizer 类时,我发现 countTokens 方法根据 countTokens 中的参数是定义的字符串还是用户定义的字符串返回不同的结果。例如,以下代码打印值 4。

String phrase = "Alpha bRaVo Charlie delta";

StringTokenizer token = new StringTokenizer(phrase);
//There's no need to specify the delimiter in the parameters, but I've tried
//both code examples with " " as the delimiter with identical results

int count = token.countTokens();

System.out.println(count);

但是当用户输入时这段代码会打印值1:Alpha bRaVo Charlie delta

Scanner in = new Scanner(System.in);

String phrase;

System.out.print("Enter a phrase: ");

phrase = in.next();

StringTokenizer token = new StringTokenizer(phrase);

int count = token.countTokens();

System.out.println(count);

【问题讨论】:

  • 把这个扔出去(来自docs):“StringTokenizer 是一个遗留类,出于兼容性原因保留,尽管不鼓励在新代码中使用它”。可能想考虑使用String#split(String)
  • 感谢您的输入,但我需要将 StringTokenizer 类用于类分配。

标签: java input token delimiter stringtokenizer


【解决方案1】:

使用 in.nextLine() 代替 in.next();

【讨论】:

  • 那行不通。 next() 和 nextLine() 都接受字符串输入。只是为了确保我测试了它。不用找了。使用 nextLine() 也会引入键盘缓冲区问题。
  • 它对我来说非常好用。扫描仪输入 = 新扫描仪(System.in);字符串短语;短语 = in.nextLine(); StringTokenizer token = new StringTokenizer(短语); int count = token.countTokens(); System.out.println(count);运行:Alpha bRaVo Charlie delta 4 BUILD SUCCESSFUL(总时间:19 秒)
  • @CraigK。不同的是next()遇到空格会断掉。 nextLine() 没有
  • 比阿特丽斯和文斯,感谢您的澄清。我遇到的其他问题是由于 IDE 存在问题。
【解决方案2】:

Scanner in = new Scanner(System.in);

字符串短语;

System.out.print("请输入一个短语:");

短语 = in.nextLine();

System.out.print(短语);

StringTokenizer token = new StringTokenizer(phrase);

int count = token.countTokens();

System.out.println(count);

打印短语并检查 in.next() 是否返回“Alpha”。

如上所述,使用 in.nextLine()。

【讨论】:

    【解决方案3】:

    您可以尝试使用 InputStreamReader,而不是 Scanner:

    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    
    String phrase = "";
    
    System.out.print("Enter a phrase: ");
    
    try {
        phrase = in.readLine();
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    StringTokenizer token = new StringTokenizer(phrase);
    
    int count = token.countTokens();
    
    System.out.println(count);
    

    Scanner 的 nextLine() 也为我完成了这项工作。

    如果您希望分隔符专门为空格字符,您可能希望将其传递给 StringTokenizer 的构造函数。否则它将使用“ \t\n\r\f”(其中包括空格字符,但如果 \n 字符也出现在短语中,则可能无法按预期工作)。

    【讨论】:

      【解决方案4】:

      如果您检查phrase 的值,在调用in.next() 之后,您会看到它等于“Alpha”。根据定义,Scanner 的 next() 会读取下一个 token

      请改用in.nextLine()

      【讨论】:

      • 我已经测试了你的建议,现在我看到了 next() 和 nextLine() 之间的区别,但是当我在我的特定应用程序中使用 nextLine() 时,程序不允许用户输入一个字符串并直接到程序的末尾。我想我可以尝试使用 hasNext 循环并维护一个累加器。
      • 由于我的 IDE,我曾经在使用 Scanner 读取输入时遇到类似的问题。你在使用 IDE 吗?尝试在命令行上运行您的程序。
      • 我的 IDE 确实有问题,我已经解决了这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 2018-07-06
      • 2016-11-21
      • 2019-10-10
      • 2014-04-13
      • 2017-03-20
      • 2013-11-04
      相关资源
      最近更新 更多