【问题标题】:How do I add synonyms to a switch statement in Java?如何将同义词添加到 Java 中的 switch 语句?
【发布时间】:2021-05-15 12:40:27
【问题描述】:

我有下面的功能,我想为每个案例添加同义词,例如案例“北”也可能是“上”,案例“东”可能是正确的等等。因为所有案例都属于同一个 try/catch声明我不确定如何针对每个特定案例做到这一点。感谢任何帮助!谢谢

public void changeRoom(boolean isValidInput, String[] input, int attemptCount) {
        while (isValidInput) {
            switch (input[1]) {
                case "north":
                case "east":
                case "south":
                case "west":
                    try {
                        if (world.getCurrentRoom().roomExits.containsKey(input[1])) {
                            player.setMostRecentExit(input[1]);
                            world.setCurrentRoom(world.getCurrentRoom().roomExits.get(input[1]));
                            isValidInput = false;
                            if (isSound) {
                                walkEffect.playSoundEffect();
                            }
                            Thread.sleep(1800);
                            narrateRooms(world.getCurrentRoom().getDescription());
                            break;
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                default:
                    System.out.println("You hit a wall. Try again: ");
                    System.out.print(">>>");
                    attemptCount++;
                    if (attemptCount >= 2) {
                        System.out.println();
                        openMap();
                        System.out.println("Where would you like to go? ");
                        System.out.print(">>>");
                    }
                    input = scanner.nextLine().strip().toLowerCase().split(" ");
                    break;
            }
        }

【问题讨论】:

  • 相同的机制,或者可能更好,通过某种规范器运行输入。请注意,“向上”仅适用于 2d 世界中的北方。
  • 您可以定义同义词映射,例如Map.of("up", "north", "right", "east" /* etc */),然后打开例如map.getOrDefault(input[1].toLowerCase(), input[1].toLowerCase()) 而不是

标签: java synonym


【解决方案1】:

只列出这样的案例:

switch (input[1]) {
            case "north": case "up":
            case "east": case "right":
            case "south": case "down":
            case "west": case "left":

【讨论】:

  • 感谢您的提示。我试过但没有奏效。我正在尝试了解如何使其正常化,但没有足够的经验来知道如何自己完成
  • 为了完整起见,我可能会添加这个作品,因为在第一个字符串和它的别名之间缺少一个 break 语句,它必须在每个 case 的前面以区分一个 case来自另一个(例如:case "north": case "up": [...] break;)。
  • 谢谢毛里齐奥!我在 try/catch 块中有一个 break 语句,我确实尝试在每个案例之间添加分号,如下所示,但仍然不起作用。我需要在 try/catch 块之外使用 break 语句吗?案例“北”:案例“上”:案例“东”:案例“右”:案例“南”:案例“下”:案例“西”:案例“左”:
  • 我不在我的电脑前,无法确认,所以我可能说错了,但是......它确实看起来像 try 块有它自己的范围,特别是当抛出异常并且没有执行中断时,这会让我说是,我会尝试在该范围之外使用中断,但仍在别名情况下。不幸的是,我已经很久没有阅读 Java 标准了,所以我对 try 结构中的 break 行为没有清晰的记忆。无论如何,“不起作用”是什么意思?默认块是执行还是什么?
  • @MaurizioCarcassona 你说得对,谢谢你的指正:)
【解决方案2】:

我能够通过创建下面的函数来规范化输入。谢谢大家!

public String normalizeText(String input) {
    List<String> northOptions = Arrays.asList("north", "up");
    List<String> southOptions = Arrays.asList("south", "down");
    List<String> eastOptions = Arrays.asList("east", "right");
    List<String> westOptions = Arrays.asList("west", "left");
    if (northOptions.contains(input.toLowerCase())) {
        return "north";
    }
    if (southOptions.contains(input.toLowerCase())) {
        return "south";
    }
    if (eastOptions.contains(input.toLowerCase())) {
        return "east";
    }
    if (westOptions.contains(input.toLowerCase())) {
        return "west";
    }
    return "";
} 

【讨论】:

  • 我看到你走的是间接的方式——我也会采取的方式 :) 干得好!
猜你喜欢
  • 1970-01-01
  • 2010-10-25
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多