我对字符串标记符有一个简单的问题。我正在摆弄这个愚蠢的程序来练习下周在学校进行的测验(在String Tokenizer上)我想知道你是否有人能提供一些关于如何在一个丛中打印标记的信息,但显然是分开的。 ..例如:
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"但我不知道该替换什么而不是什么。
非常感谢任何帮助,谢谢。
答案 0 :(得分:1)
每次循环执行while循环时,都会创建一个新的JOptionPane:
while (!(input.equalsIgnoreCase("George Clooney") && input.equalsIgnoreCase("George Washington") && input.equalsIgnoreCase("Washington Irving") && input.equalsIgnoreCase("Irving Berlin")))
{
input = JOptionPane.showInputDialog (parser.nextToken ( ));
}
这就是为什么你会得到多个弹出窗口,每次他们有一个不同的消息,这是你的一个标记。你对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()。为了解决这个问题并做你想做的事情,在上面的代码行之后,你可以改变你的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,并且所有这些的前沿意味着我们需要对所有可能性进行逻辑或。