在switch case java中使用数组

Using arrays in switch case java

我有代码,其中switch语句测试的内容取决于数组变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
String shuff = Import.shuffle();
String[] form = new String[95];
for(int i = 0; i < 95; i++)
{
    form[i] = Format.shuffle(shuff, i);
}
switch(str)
{
case"a":
    x = 6;
    break;
case"b":
    x = 16;
    break;
case"c":
    x = 23;
    break;
//So on and so forth
}

我要做的是采用数组形式[],并将其用作案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
String shuff = Import.shuffle();
String[] form = new String[95];
for(int i = 0; i < 95; i++)
{
    form[i] = Format.shuffle(shuff, i);
}
switch(str)
{
case form[0]:
    x = 6;
    break;
case form[1]:
    x = 16;
    break;
case form[2]:
    x = 23;
    break;
//So on and so forth
}

但是当我尝试这个时,它给出了错误"case表达式必须是常量表达式"。有两种方法可以解决这个问题,但我也不知道该怎么做。1。以某种方式使用开关盒中的数组2。使用某种看起来像这样的方法…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
String shuff = Import.shuffle();
String[] form = new String[95];
for(int i = 0; i < 95; i++)
{
    form[i] = Format.shuffle(shuff, i);
}
switch(str)
{
case form[0].toString():
    x = 6;
    break;
case form[1].toString():
    x = 16;
    break;
case form[2].toString():
    x = 23;
    break;
//So on and so forth
}

还有什么办法吗?

import.shuffle方法获取一个包含95行(每行为一个字符)的文本文件,并将其串在一起,然后格式化。shuffle将原始行中的每一行放入单个数组变量中。

我无法将此转换为if-else if链,因为它是一个95 case开关(edit)


您可以在form中找到str的索引,然后根据索引进行切换。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
String shuff = Import.shuffle();
String[] form = new String[95];
for(int i = 0; i < 95; i++)
{
    form[i] = Format.shuffle(shuff, i);
}
int index=Arrays.asList(form).indexOf(str);
switch(index)
{
case 0:
    x = 6;
    break;
case 1:
    x = 16;
    break;
case 2:
    x = 23;
    break;
//So on and so forth
}

但是,您提出的解决方案都不起作用,因为在编译代码时,编译器需要准确地知道每个case值是什么,而不是仅仅知道它在变量中。我不确定确切的原因,但这可能是为了优化或确保案例不被复制(这将导致编译错误,IIRC)。底线是form[0]不是常量,编译器需要一个常量。


Java的EDCOX1×0语句要求EDCOX1×1个标签是常量表达式。如果您的代码不符合这个限制,那么您将需要使用if...elseif...else结构来代替。

见JLS第14.11条:

SwitchLabel:
   caseConstantExpression:
   caseEnumConstantName:
   default :


如前所述,Java在其switch语句的情况下需要常量表达式。

您可能需要更好地设计结构。我注意到,在每种情况下,您都在对x进行变量赋值。如果这是您的真实代码,您可以在Map中映射x个可能的值,或者甚至可以基于索引在int数组中映射它们,以便更快地检索它(使用O(1)复杂性)。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
//With maps - based on string values
Map<String, Integer> values = new HashMap<String, Integer>();
values.put(form[0], 6);
values.put(form[1], 16);
values.put(form[2], 23);
//....
x = (int) values.GetValue(str); //str value is your indexer here.


//With arrays, based on indexes
int[] values = new int[] {6, 16, 23/*,...*/};
x = values[i]; // i is your indexer here.

如果你真的需要这样做,你必须使用一连串的if/else。它的效率不会低于您想象的switch语句的效率。所以:

1
2
3
if      (str.equals(form[0])) { x = 6; }
else if (str.equals(form[1])) { x = 16; }
else if (str.equals(form[2])) { x = 23; }

也需要更少的源代码行。