首页 > 解决方案 > 在java中使用Scanner类递归获取字符串用户输入

问题描述

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

输出:“Thank you, got Danny” 输出:(之前的长度,输入太长)+“字符太多,尽量保持在 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;
}

标签: javastringuser-input

解决方案


我采用了您的方法并对其进行了一些修改。

它是非递归解决方案。

同样在您的代码扫描器资源中,最后没有关闭。

迭代解决方案

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;
    }
}

推荐阅读