countTokens() 总是 returns 1 用户输入

countTokens() always returns 1 with user input

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

使用 StringTokenizer class 时,我发现 countTokens 方法 returns 不同的结果取决于 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);

但是当用户 enters:Alpha bRaVo Charlie delta

时,此代码将打印值 1
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);

使用 in.nextLine() 而不是 in.next();

扫描仪 in = 新扫描仪(System.in);

字符串词组;

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

短语=in.nextLine();

System.out.print(词组);

StringTokenizer token = new StringTokenizer(phrase);

int 计数 = token.countTokens();

System.out.println(计数);

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

按照上面的建议,使用 in.nextLine()。

您可以尝试使用 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() 也为我完成了工作。

如果您希望定界符具体为 space 字符,您可能希望将其传递给 StringTokenizer 的构造函数。否则它将使用“\t\n\r\f”(其中包括 space 字符,但如果例如短语中也存在 \n 字符,则可能无法按预期工作)。

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

改用in.nextLine()