在检查用户输入的字母时避免 26 if/elseif/else 语句

Avoid 26 if/elseif/else statements when checking for a letter in user input

我只是想知道是否有一种简单的方法来检查用户输入的字母的值。例如,

Scanner scanner = new Scanner(System.in);
String message = scanner.nextLine();
String letter;
int length = message.length();
for (int i=0; i < length; i++) {
    letter = message.substring(i, i+1);
    if (letter.equalsIgnoreCase("a")) {
        System.out.println("letter a");
        // Of course the real program won't just print out "letter a" but this is
        // to show that all actions are different
    } else if(letter.equalsIgnoreCase("b") {
        System.out.println("letter b");
    } // etc... for all of the possible values of "letter"
}

有什么方法可以写出上面的语句而不必写 26+ if/else 条语句吗? (我知道有 switch-case,但你仍然需要写 26 个以上)。非常感谢任何帮助!

您可以将字母转换为字符值,然后直接检查对应的 ASCII。然后它将是数字的并且也更容易。这样无论你做什么操作,都可以转换成ASCII格式,轻松搞定。

不知道你想在 if 部分做什么,这是解决这个问题的最通用的方法:

    final Map<String, Consumer<String>> actions = new HashMap<>();
    actions.put("a", this::performActionA);
    actions.put("b", this::performActionB);

    final Scanner scanner = new Scanner(System.in);
    final String message = scanner.nextLine();
    String letter;
    final int length = message.length();
    for (int i = 0; i < length; i++) {
        letter = message.substring(i, i + 1);
        actions.get(letter).accept(message);
    }

然后你需要有这样的方法:

private void performActionA(final String message) {
    System.out.println("Test.performActionA()");
}

private void performActionB(final String message) {
    System.out.println("Test.performActionB()");
}

当然在生产中你可能想检查是否有一个动作,但我把它留给你了。

好吧,根据评论,您只是根据字母打印不同的文本。在那种情况下,Tim 使用 Map 的想法非常好。我将向您展示一个基本示例:


在您的 class 中,创建一个 HashMap。我猜 final static 一个就可以了:

private static final HashMap<String, String> messages = new HashMap<String, String>();
static {
    messages.put("A", "Hello!");
    messages.put("B", "Again!");
    messages.put("C", "Etc etc!");
}

注意键都是大写的。因此,当您收到字母时,您也应该将其转换为大写字母:

letter = message.substring(i,i+1).toUpperCase();

现在您可以打印消息了:

String toPrint = messages.get(letter);

而且您无需进行 26 次切换即可打印出来。


以上解决方案假定您需要打印某种自定义文本。否则其他人的解决方案都很好:打印字母即可。