Java 使用扫描仪的万无一失的用户输入程序
这个方法是一个更大的程序的一部分,它要求特定的用户输入,我需要这个方法来提示用户输入,直到正确为止。这是我的Java 使用扫描仪的万无一失的用户输入程序,java,Java,这个方法是一个更大的程序的一部分,它要求特定的用户输入,我需要这个方法来提示用户输入,直到正确为止。这是我的 public static String validName(Scanner input, Scanner histogram) { String user = ""; String name = input.next(); boolean test = false; while (histogram.hasNext()) { user =
public static String validName(Scanner input, Scanner histogram) {
String user = "";
String name = input.next();
boolean test = false;
while (histogram.hasNext()) {
user = histogram.next();
if (name.equalsIgnoreCase(user)) {
test = true;
break;
}
else {
test = false;
}
}
if (!test) {
System.out.println("Name not found");
}
return user;
}
扫描仪正在读取一个txt文件。到目前为止,它工作得很好,但实际上它只运行一次
我可以更改或添加什么以使其正常工作?这里有一个快速解决方案。创建一个临时的
扫描仪
,并将其设置为直方图
,然后再运行直方图
。如果找到用户,则validName()
将返回该用户,如果没有,则通过传入input
和直方图tmp
的副本重复此功能。这将完成工作,但不是执行此任务的正确方式
更新
创建一个临时字符串,并将每个用户添加到字符串中,后跟一个空格。如果检查失败,则使用由用户字符串构造的匿名扫描器
调用函数
public static String validName(Scanner input, Scanner histogram) {
String user = "";
String name = input.next();
String tmp = "";
boolean test = false;
while (histogram.hasNext()) {
user = histogram.next();
tmp += user + " ";
if (name.equalsIgnoreCase(user)) {
test = true;
break;
}
else {
test = false;
}
}
if (!test) {
System.out.println("Name not found");
user = validName(input, new Scanner(tmp));
}
return user;
}
这里有一个快速解决方案。创建一个临时的
扫描仪
,并将其设置为直方图
,然后再运行直方图
。如果找到用户,则validName()
将返回该用户,如果没有,则通过传入input
和直方图tmp
的副本重复此功能。这将完成工作,但不是执行此任务的正确方式
更新
创建一个临时字符串,并将每个用户添加到字符串中,后跟一个空格。如果检查失败,则使用由用户字符串构造的匿名扫描器
调用函数
public static String validName(Scanner input, Scanner histogram) {
String user = "";
String name = input.next();
String tmp = "";
boolean test = false;
while (histogram.hasNext()) {
user = histogram.next();
tmp += user + " ";
if (name.equalsIgnoreCase(user)) {
test = true;
break;
}
else {
test = false;
}
}
if (!test) {
System.out.println("Name not found");
user = validName(input, new Scanner(tmp));
}
return user;
}
您可以使用扫描仪的
findInLine(字符串模式)
方法,尝试以下操作:
public static String validName(Scanner input, Scanner histogram) {
String user = "";
String name = input.next();
if(histogram.findInLine(name) != null){
System.out.println("This name exist");//Do what you have to do here
}
else{
System.out.println("Name not found");
user = validName(input, histogram);
}
return user;
}
查看以了解更多信息。您可以使用扫描仪的
findInLine(字符串模式)
方法,尝试以下操作:
public static String validName(Scanner input, Scanner histogram) {
String user = "";
String name = input.next();
if(histogram.findInLine(name) != null){
System.out.println("This name exist");//Do what you have to do here
}
else{
System.out.println("Name not found");
user = validName(input, histogram);
}
return user;
}
查看更多信息。这可能不是一个完美的解决方案,但我会这样做:首先将完整的Historogram读入哈希表。这允许以后进行非常有效的输入验证:
public static String validName(Scanner input, Scanner histogram) {
HashSet<String> validInputs = new HashSet<>();
// read in histogram
while (histogram.hasNext())
validInputs.add(histogram.next());
// ask for input and repeat if necessary
while (true) {
String userInput = input.next();
if (validInputs.contains(userInput))
return userInput;
System.out.println("invalid input");
}
}
公共静态字符串有效名称(扫描仪输入、扫描仪直方图){
HashSet validInputs=新HashSet();
//读入直方图
while(histogram.hasNext())
add(histogram.next());
//请求输入,必要时重复
while(true){
字符串userInput=input.next();
if(validInputs.contains(userInput))
返回用户输入;
System.out.println(“无效输入”);
}
}
我还没有测试过这个解决方案,但它应该可以工作。
此外,直方图只能读取一次。之后,只比较不同字符串的哈希值。由于具有相同内容的两个字符串应始终具有相同的哈希值,因此应该可以这样做
此外,此解决方案不需要任何递归。这可能不是一个完美的解决方案,但我会这样做:首先将完整的Historogram读入哈希表。这允许以后进行非常有效的输入验证:
public static String validName(Scanner input, Scanner histogram) {
HashSet<String> validInputs = new HashSet<>();
// read in histogram
while (histogram.hasNext())
validInputs.add(histogram.next());
// ask for input and repeat if necessary
while (true) {
String userInput = input.next();
if (validInputs.contains(userInput))
return userInput;
System.out.println("invalid input");
}
}
公共静态字符串有效名称(扫描仪输入、扫描仪直方图){
HashSet validInputs=新HashSet();
//读入直方图
while(histogram.hasNext())
add(histogram.next());
//请求输入,必要时重复
while(true){
字符串userInput=input.next();
if(validInputs.contains(userInput))
返回用户输入;
System.out.println(“无效输入”);
}
}
我还没有测试过这个解决方案,但它应该可以工作。
此外,直方图只能读取一次。之后,只比较不同字符串的哈希值。由于具有相同内容的两个字符串应始终具有相同的哈希值,因此应该可以这样做
此外,此解决方案不需要任何递归。因此,您希望不断询问用户,直到他输入直方图中的内容?确切地说@ksmonkey123您的直方图有多大?它是否足够小,可以完全读入并保存在RAM中?好的。一旦我写完,请查看下面的答案。你想继续询问用户,直到他输入直方图中的内容吗?确切地说@ksmonkey123你的直方图有多大?它是否足够小,可以完全读入并保存在RAM中?好的。一旦我写完,请查看下面我的答案这在重新提示用户输入时起作用,但每次它输出“找不到名称”,不管输入是否正确,都是因为我的错误,
Scanner tmp=histogram
没有克隆histogram
。我将更新我的答案。它是有效的,但由于某些原因,如果名称无效(不存在),则需要很长时间才能输出名称未找到字符串。也许它只是我的计算机?它不是你的计算机:)while循环必须在输出“Name not found”之前运行约170KB的数据@ksmonkey123使用HashMap
是正确的,但不是函数中的局部变量,因为只需填充一次类成员HashMap
,并从函数中调用该HashMap
。哦,好的,谢谢,至于HashMap,assignment不允许我使用它。我想你忘了在问题中提到,这在重新提示用户输入时起作用,但是每次它输出“找不到名称”,不管输入是否正确,都是因为我的错误,Scanner tmp=histogram
没有克隆histogram
。我将更新我的答案。它是有效的,但由于某些原因,如果名称无效(不存在),则需要很长时间才能输出名称未找到字符串。也许它只是我的计算机?它不是你的计算机:)while循环必须在输出“Name not found”之前运行约170KB的数据@ksmonkey123对此使用HashMap
是正确的,但不是函数中的局部变量,因为只需填充一次类成员HashMap
,并从函数中调用该HashMap
。哦,好的,谢谢