在java中使用数组作为switch case语句

时间:2013-01-01 16:50:09

标签: java arrays io switch-statement

我正在制作游戏,我希望控件可以编辑。好吧,我已经把那部分放下了,但它们正在.txt文件中被读取和更改。这就是我希望它现在工作的方式。值存储为键值(即KeyEvent.VK_W等于83,因此该行的值为83)。我也让它读取值并将它们保存到我的核心类中的String数组变量中。在我的键事件类中,处理键的推送,我让它引用数组来检查是否按下了命令键。我不断收到此错误:case expressions must be constant expressions当我尝试它时。这是错误的代码:

switch(key){
  case Integer.parseInt(commands[1]):
      ...
      break;
}

我得到了那个错误。 commands[1]的值是83.它是“W”的值。这是我对变量的声明:

for (int i = 0; i < commands.length; i++) {
                commands[i] = io.readSpecificLine(FILES.controlsFileFinalDir,
                        i + 1);
}

如果我打印出每个值,它确实有效。我已经尝试制作数组final但是没有用。我大约在2年前遇到了解决方案,但我再也找不到了。有没有人有任何想法如何解决这个问题?提前谢谢!

2 个答案:

答案 0 :(得分:4)

正如编译器所说,case表达式必须是常量表达式。您不能将数组元素用作案例表达式。您只需使用if / else if / else子句即可。

答案 1 :(得分:1)

您不能在case语句中使用非常量表达式。另一种方法是构建从值到动作的映射。所以不是这个(对我来说实际上没有任何意义):

switch (key) {
case Integer.parseInt(commands[1]):
    // action 1
    break;
// other cases...
default: 
    // default action
}

您可以这样做:

static Map<Integer, Runnable> keyMap = new HashMap<Integer, Runnable>();
static {
    keyMap.put(83, new Runnable() {
        @Override
        public void run() {
            // actions for code 83
        }
    });
    . . .
}

(如果更有意义,这也可以基于每个实例而不是静态地图完成。)然后:

Runnable action = keyMap.get(Integer.parseInt(commands[1]));
if (action != null) {
    action.run();
} else {
    // default action
}

如果您需要将变量传递给您的操作,则可以定义自己的界面,而不是使用Runnable来执行操作。