java - 在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;
}
解决方案
我采用了您的方法并对其进行了一些修改。
它是非递归解决方案。
同样在您的代码扫描器资源中,最后没有关闭。
迭代解决方案
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;
}
}
推荐阅读
- c# - 一旦字符在 y 上变为 0,如何停止字符旋转?
- python - 如何从熊猫系列元素中获取“聚合”字数
- reactjs - 使用 create-react-app 将变量抛出范围之外
- git - 显示额外提交的 git log 命令
- java - 拆分列表然后排序
- sass - 通过相对路径包含图像的正确方法
- objective-c - 如何证明文本的合理性或使其停止分隔 UITextview 中的单词?
- python - 如何调试此代码计算两个 unicode 文件的余弦相似度?
- angular6 - 如何在angular6中将面包屑用于href和路由器链接
- java - Pax 考试:从非标准 Maven 存储库中解析 Karaf 功能存储库(XML 文件)