这个方法是一个更大的程序的一部分,它要求特定的用户输入,我需要这个方法来提示用户输入,直到它正确。这就是我所拥有的
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文件。到目前为止,它工作正常,但它只会经历一次。
我可以更改或添加哪些内容以使其正常工作?
答案 0 :(得分:2)
这是一个快速修复。在运行Scanner
之前,创建一个临时histogram
并将其设置为histogram
。如果找到用户,那么validName()
将返回该用户,如果没有,则通过传递input
和直方图tmp
的副本来重复此功能。这将完成工作,但不是完成此任务的正确方法。
创建一个临时字符串,并将每个用户添加到字符串后跟一个空格。如果检查失败,则使用由用户字符串构造的匿名Scanner
重新调用该函数。
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;
}
答案 1 :(得分:2)
您可以使用扫描仪的findInLine(String pattern)
方法,尝试以下操作:
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;
}
请查看the Scanner Class methods了解详情。
答案 2 :(得分:2)
这可能不是一个完美的解决方案,但我会如何做到这一点:首先将完整的histogramm读入哈希表。这允许稍后进行非常有效的输入验证:
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");
}
}
我没有测试过这个解决方案,但应该可行。 直方图也只读过一次。之后,仅比较不同字符串的哈希值。由于具有相同内容的2个字符串应始终具有相同的哈希值,因此应该可以使用。
此解决方案也不需要任何递归。