Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用扫描仪的万无一失的用户输入程序_Java - Fatal编程技术网

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
。哦,好的,谢谢