在 java 中使用 Scanner class 递归获取字符串用户输入

Recursively getting string user input with Scanner class in java

所以,我想接收用户的输入,检查他们是否使用了字母值,然后检查它是否太长。如果太长,我想通过调用我所在的方法从顶部重新开始(检查是否按字母顺序排列)。但是,当我重新开始并输入“Danny”时,这将显示:

Output: "Thank you, got Danny" Output: (length of previous, too long input) + "is too many characters, try to keep it under 30."

因此,它以某种方式保留了原始输入(按字母顺序排列,但大于 30)并且在重新开始时不会更改它。有人知道我应该怎么做吗?

public static String inputPattern() {
    Scanner scanner = new Scanner(System.in);
    String player;
    int strLength;

    System.out.println("Please enter your name:");
    while (!scanner.hasNext("[A-Za-z]+")) { //Checks if alphabetical value
        System.out.println("Please stick to the alphabet!");
        scanner.next();
    }
    player = scanner.next();
    player += scanner.nextLine();


    System.out.println("Thank you! Got " + player);

    strLength = player.length(); // Saves the length of user-inputted name
    while (strLength > 30) { // Checks if not too long
        System.out.println(strLength + " is too many characters, please try to keep it under 30");
        inputPattern(); // Starts over again if too long
    }

    return player;
}

我借鉴了你的方法,稍微修改了一下

非递归解

另外在你的扫码器资源最后也没有关闭。

迭代求解

import java.util.Scanner;

public class SO66064473 {
    public static void main(String[] args) {
        inputPatternIterative();
    }

    public static String inputPatternIterative() {
        Scanner scanner = new Scanner(System.in);
        String player = "";
        int strLength = Integer.MAX_VALUE;

        while (strLength > 30) {                     // Checks if not too long
            System.out.println("Please enter your name:");
            while (!scanner.hasNext("[A-Za-z]+")) {             //Checks if alphabetical value
                System.out.println("Please stick to the alphabet!");
                scanner.next();
            }
            player = scanner.next();
            player += scanner.nextLine();
            System.out.println("Thank you! Got " + player);
            strLength = player.length();       // Saves the length of user-inputted name
            if (strLength > 30)
                System.out.println(strLength + " is too many characters, please try to keep it under 30");
        }
        scanner.close(); // Closing scanner resource after use.
        return player;
    }
}

输出:

Please enter your name:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Thank you! Got aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
70 is too many characters, please try to keep it under 30
Please enter your name:
aaaaaaaaaaaaaaaaaaaa12
Please stick to the alphabet!
coifvoifoivmrfvoirvoirovroijfoirjfoijroifjrwofjorwfouwrfoijwrofjworjfoiwrjf
Thank you! Got coifvoifoivmrfvoirvoirovroijfoirjfoijroifjrwofjorwfouwrfoijwrofjworjfoiwrjf
75 is too many characters, please try to keep it under 30
Please enter your name:
Danny
Thank you! Got Danny

编辑:根据@Dev-vruper 的建议,这里更新了简单的递归代码

递归求解

import java.util.Scanner;

public class SO66064473 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        inputPatternRecursive(sc);
        sc.close();
    }

    public static String inputPatternRecursive(Scanner sc) {
        System.out.println("Please enter your name:");
        String player = sc.nextLine();
        if (!player.matches("[A-Za-z]+")) {
            System.out.println("Please stick to the alphabet!");
            inputPatternRecursive(sc);
        } else {
            System.out.println("Thank you! Got " + player);
            if (player.length() > 30) {
                System.out.println(player.length() + " is too many characters, please try to keep it under 30");
                inputPatternRecursive(sc);
            }
        }
        return player;
    }
}

这应该可以很简单地解决您的问题:

public static String inputPattern(){
    Scanner scanner = new Scanner(System.in);
    String player = "";
    int strLength;
    boolean bShowedInstruction = true;

    System.out.println("Please enter your name:");

    while (true) {
        if (!bShowedInstruction)
            System.out.println("Please enter your name:");

        bShowedInstruction = false;
        player = scanner.next();

        if (!player.matches("[A-Za-z]+")) {
            System.out.println("Please stick to the alphabet!");
        }
        else if (player.length() > 30) {
            System.out.println(player.length() + " is too many characters, please try to keep it under 30!");
        }
        else
            break;
    }

    System.out.println("Thank you! Got " + player);
    return player;
}

不需要递归。一个简单的 while(true) 循环就可以解决问题。 这是一个非常干净的解决方案,将不必要的扫描方法排除在游戏之外。