java - 使用用户输入的子字符串切换语句
问题描述
目标:我正在尝试根据用户的输入输出一条消息。
情况:基本上用户会输入几个字符,如 5r(5 Red)或 8y(8 Yellow)。预期的符号是先有数字,后有字符,但用户可能不遵守规则。
我使用了 switch 语句(练习的一部分),但输出并没有给我我的期望
代码:
String input = reader.nextLine().toLowerCase();
String firstChar = input.substring(0,1);
String secondChar = input.substring(1);
String answer = "";
switch(firstChar)
{
case "0":
{
switch(secondChar)
{
case "b":
answer = "Zero Blue";
case "r":
answer = "Zero Red";
case "g":
answer = "Zero Green";
case "y":
answer = "Zero Yellow";
}
}
case "1":
{
switch(secondChar)
{
case "b":
answer = "One Blue";
case "r":
answer = "One Red";
case "g":
answer = "One Green";
case "y":
answer = "One Yellow";
}
}
... other case statements....
default:
answer = "not valid";
当用户写入 0b 时,我的输出应该是“零蓝”,但目前它显示“无效”。为什么?
解决方案
正如@markspace 提到的那样,您缺少一个 break 语句。以下是关于 switch 语句的 Java文档的简短摘录:
每个 break 语句都会终止封闭的 switch 语句。控制流继续 switch 块之后的第一条语句。break 语句是必要的,因为没有它们,switch 块中的语句就会失败。
我还建议使用专用的方法和for
循环以便于调试。
以下代码产生您想要的结果:
public static String getAnswer() {
Scanner reader = new Scanner(System.in);
String input = reader.nextLine().toLowerCase();
String firstChar = input.substring(0, 1);
String secondChar = input.substring(1);
String[] chars = new String[] { "b", "r", "g", "y" };
String[] answers1 = new String[] { "Zero Blue", "Zero Red", "Zero Green", "Zero Yellow" };
String[] answers2 = new String[] { "One Blue", "One Red", "One Green", "One Yellow" };
if ((firstChar.equals("0"))) {
for (int i = 0; i < chars.length; i++) {
if (secondChar.equals(chars[i])) {
return answers1[i];
}
}
}
else if ((firstChar.equals("1"))) {
for (int i = 0; i < chars.length; i++) {
if (secondChar.equals(chars[i])) {
return answers2[i];
}
}
}
return "not valid";
}
public static void main(String[] args) throws IOException {
System.out.println(getAnswer());
}
编辑:除了上面的解决方案之外,我还想提供一个更复杂的解决方案,其中涉及使用枚举器。它应该让你的代码感觉更干净、更切题,并且更模块化:
public enum Answer {
BLUE('b',"Blue"), RED('r',"Red"),
GREEN('g',"Green"), YELLOW('y',"Yellow");
private static final String[] prefix = new String[] {"Zero", "One"};
char letter;
String name;
Answer(char letter, String name) {
this.letter = letter;
this.name = name;
}
public static String getForInput(char input, int index) {
if (index > prefix.length)
return "value out of range " + index;
for (Answer answer : Answer.values()) {
if (input == answer.letter)
return prefix[index] + " " + answer.name;
}
return "unable to find answer for input " + input;
}
}
public static String getAnswer() {
System.out.println("Enter your input: ");
Scanner reader = new Scanner(System.in);
String input = reader.nextLine().toLowerCase();
int number = Integer.valueOf(input.substring(0, 1));
char letter = input.substring(1).charAt(0);
return Answer.getForInput(letter, number);
}
推荐阅读
- java - 如何在 Intellij 中使用 LWJGL 2 而不是 LWJGL 3?
- python - 矩形选择器和matplotlib图形之间的动态交互
- html - 通过 EXCEL VBA 填写 Web 表单 - 找不到 ID 或任何东西来填写表单
- java - Modelio 类图隔间
- python-3.x - 如何将列表的内容作为字符串获取?
- postgresql - 定期查询 Postgresql 并在 Dashboard 上可视化
- javascript - 如果预填充文本区域,如何显示剩余字符?
- firebase - FIRESTORE:按文档 ID 查询 collectionGroup
- sql - 我如何用英语解释这个?
- python - 使用 lstm 根据前几天的数据预测下一个位置