Java中⽤switch构造数组_在switchcasejava中使⽤数组我有代码,其中switch语句测试的内容取决于数组变量:
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
}
我要做的是采⽤数组形式[],并将其⽤作案例:
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;
switch语句必须使用break吗case form[2]:
x = 23;
break;
//So on and so forth
}
但是当我尝试这个时,它给出了错误"case表达式必须是常量表达式"。有两种⽅法可以解决这个问题,但我也不知道该怎么做。1。以某种⽅式使⽤开关盒中的数组2。使⽤某种看起来像这样的⽅法…
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的索引,然后根据索引进⾏切换。例如:
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...lse结构来代替。
见JLS第14.11条:
SwitchLabel:
caseConstantExpression:
caseEnumConstantName:
default :
问题是它是⼀个95箱的开关
@Stealth9799您必须执⾏哪种操作?
@隐形9799如果你真的想使⽤95箱的开关,有更好的⽅法来解决这个问题。
如前所述,Java在其switch语句的情况下需要常量表达式。
您可能需要更好地设计结构。我注意到,在每种情况下,您都在对x进⾏变量赋值。如果这是您的真实代码,您可以在Map中映射x个可能的值,或者甚⾄可以基于索引在int数组中映射它们,以便更快地检索它(使⽤O(1)复杂性)。
实例:
//With maps - based on string values
Map values = new HashMap();
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语句的效率。所以:
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。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。