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)
- 或者使用Java 1.7/1.8。它们支持开关中的字符串。
- @但这并不是亚历克西斯·金指出的唯一问题
您可以在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 :
- 问题是它是一个95箱的开关
- @Stealth9799您必须执行哪种操作?
- @隐形9799如果你真的想使用95箱的开关,有更好的方法来解决这个问题。
如前所述,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; } |
也需要更少的源代码行。
- 你走捷径了。你把if语句放在一行上,而不是分散它们。而且,对于switch语句中足够多的语句,结果可能更有效。
- 它更有效的原因是为什么条件必须是常数…创建跳转表。如果使用Java 7/8字符串变量,它编译成级联的I/EL。