使用扫描仪的万无一失的用户输入程序

时间:2014-11-24 09:12:21

标签: java

这个方法是一个更大的程序的一部分,它要求特定的用户输入,我需要这个方法来提示用户输入,直到它正确。这就是我所拥有的

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文件。到目前为止,它工作正常,但它只会经历一次。

我可以更改或添加哪些内容以使其正常工作?

3 个答案:

答案 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个字符串应始终具有相同的哈希值,因此应该可以使用。

此解决方案也不需要任何递归。