我有一个关于 String Tokenizer 的快速问题。我正在摆弄这个愚蠢的程序来练习下周在学校进行的测验(关于 String Tokenizer),我想知道你们中的任何人是否可以向我提供一些关于如何在一个 block 中打印 token 的信息,但显然是分开的。 .. 例如:
import javax.swing.*;
import java.util.*;
public class stringTokenizer
{
public static void main (String [] args)
{
String questionData = "Who was the first US president#George Clooney#George
Washington#Washington Irving#Irving Berlin";
String delimiters = JOptionPane.showInputDialog ( "Enter a delimiter" );
StringTokenizer parser = new StringTokenizer ( questionData, delimiters );
System.out.println("\nThe string " + questionData+" has "+
parser.countTokens()+ " tokens");
String input = " ";
input = JOptionPane.showInputDialog (parser.nextToken ( ) );
while (!(input.equalsIgnoreCase("George Clooney") && input.equalsIgnoreCase("George Washington") && input.equalsIgnoreCase("Washington Irving") && input.equalsIgnoreCase("Irving Berlin")))
{
input = JOptionPane.showInputDialog (parser.nextToken ( ));
}
if (input == "George Washington")
{
System.out.println ("YAY! You know the first president of the United
States!");
}
else
{
System.out.println ("Yer dumb...");
}
System.exit (0);
}
}
发生的事情是: 每个标记都打印到一个 JOptionPane 中......我只希望它在一个 JOptionPane 中但看起来像:
Who was the first president?
George Clooney
George Washington
George Irving
Irving Berlin
就是这样!我知道这是因为我使用的是“nextToken”,但我不确定应该在那里替换什么,而不是替换什么。
任何帮助将不胜感激,谢谢。
最佳答案
每次循环 while 循环时,都会创建一个新的 JOptionPane:
while (!(input.equalsIgnoreCase("George Clooney") && input.equalsIgnoreCase("George Washington") && input.equalsIgnoreCase("Washington Irving") && input.equalsIgnoreCase("Irving Berlin")))
{
input = JOptionPane.showInputDialog (parser.nextToken ( ));
}
这就是为什么您会收到多个弹出窗口,并且每次它们都有一条不同的消息,这是您的 token 之一。您对 StringTokenizer 的使用是正确的,显示它的逻辑让您失望。相反,尝试循环遍历所有标记以创建将出现在弹出窗口中的字符串,然后一次创建弹出窗口以获得您的输入,如下所示:
StringBuilder display = new StringBuilder();
int tokens = parser.countTokens();
for(int i = 0; i < tokens; i++)
{
display.append(parser.nextToken() + "\r\n");
}
input = JOptionPane.showInputDialog (display.toString());
你是说你打算用 while 循环验证输入;所以你仍然可以用上面的代码做到这一点;但是您现在的代码仍然不会在对话框中适本地创建消息,并且如果您多次输入无效输入,它将抛出异常,因为解析器将用完 nextToken()s。为了解决这个问题并做您想做的事,在上面的代码行之后,您可以将 while 循环更改为:
while (!(input.equalsIgnoreCase("George Clooney") || input.equalsIgnoreCase("George Washington") || input.equalsIgnoreCase("Washington Irving") || input.equalsIgnoreCase("Irving Berlin")))
{
input = JOptionPane.showInputDialog (display);
}
因为我们使用的是 equalsIgnoreCase,所以我们应该在 if 语句中使用相同的方法来查看问题是否被正确回答:
if (input.equalsIgnoreCase("George Washington"))
另外,请注意,我将 while 循环中的逻辑更改为 OR 而不是 AND,因为我们希望 while 循环在每个返回 false 时继续运行,而不是在其中任何一个返回 false 时继续运行,并且否定所有这些都放在前面意味着我们需要对所有可能性进行逻辑或。
关于java - 字符串分词器 JOptionPane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28789597/