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

2022-08-31 12:57:41

我正在尝试做这样的事情,即在switch语句中使用数组。在Java中可能吗?如果不是,请解释一个可能的解决方案。

boolean[] values = new boolean[4];

values[0] = true;
values[1] = false;
values[2] = false;
values[3] = true;

switch (values) {
    case [true, false, true, false]:
        break;
    case [false, false, true, false]:
        break;
    default:
        break;
}

答案 1

@s ᴜʀᴇsʜ ᴀᴛᴛᴀ 是对的。但我想添加一些东西。从Java 7开始,switch语句支持字符串,因此您可以对此执行一些操作。它真的很脏,我不建议,但这有效:

boolean[] values = new boolean[4];

values[0] = true;
values[1] = false;
values[2] = false;
values[3] = true;

switch (Arrays.toString(values)) {
    case "[true, false, true, false]":
        break;
    case "[false, false, true, false]":
        break;
    default:
        break;
}

对于那些关心性能的人来说:你是对的,这不是超级快。这将被编译成如下内容:

String temp = Arrays.toString(values)
int hash = temp.hashCode();
switch (hash)
{
    case 0x23fe8da: // Assume this is the hashCode for that
                    // original string, computed at compile-time
        if (temp.equals("[true, false, true, false]"))
        {

        }
        break;
    case 0x281ddaa:
        if (temp.equals("[false, false, true, false]"))
        {

        }
        break;

    default: break;
}

答案 2

,你根本做不到。

SwitchStatement:
    switch ( Expression ) SwitchBlock

表达式的类型必须是 char、byte、short、int、Character、Byte、Short、Integer、String 或枚举类型 (§8.9),否则会发生编译时错误。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.11