2011-12-02 123 views
2

我有一个很大的Ifs列表,我想将它更改为switch语句。目前,它看起来像这样:开关情况下的多个值/转换ifs到switch语句

if(x == 1){ 
    ... 
} 
if(x == 2){ 
    ... 
} 
if(myArray.contains(x)){ 
    ... 
} 

实际上它比这更长一点,但它是第三,如果在混淆我的例子 - 我该如何改变这种状况围绕得到它的开关工作,或它甚至有可能吗?

回答

17

你可以做这样的事情,但根据您的代码可能退出条件因人而异:

switch (x) { 
case 1: 
    ... 
    break; 
case 2: 
    ... 
    break; 
case 3: 
case 4: 
    ... multi-case 
    break; 
default: 
    if(myArray.contains(x)){ 
    ... 
    } 
} 
+1

这也略有不同:开关/箱是一个'if' ...'否则if'。在其中x在“then”块语句中被修改的情况下,整体行为将会不同。 – rds

+3

与问题中的前两个ifs不同,即使前面的一个也是如此,第三个仍然可以是真的。 'x'不能同时等于'1'和'2',但它可以等于'1'并且同时包含在'myArray'中。将if语句移入'case'语句'default'可能不是正确的解决方案。 –

+0

对不起,我应该澄清 - 数组中的值将永远不会匹配我检查的其他任何内容,所以这不是问题。尽管如此。 – Steve

1

您只能在x值上开关。这意味着最后一个条件将不会是交换机的一部分:

switch(x) { 
case 1: 
    ... 
    break; 
case 2: 
    ... 
    break; 
} 
if(myArray.contains(x)){ 
    ... 
} 
1

是的,这是可能的。 switch语句将使它更简洁,更易于维护。你必须担心x,因为它必须是编译时常量。

switch(x) { 
case 1: 
    doSomething(); 
    break(); 
case 2: 
    doSomethingElse(); 
    break(); 

default: 
if(myArray.contains(x)){ 

} 


//etc... 
} 
3

switch语句只能用于测试x的平等

所以,如果not equality conditions像(if(myArray.contains(x)))一定要来结尾,那么您可以复制粘贴到交换机的默认部分

它看起来这样

switch (x) { 
    case 1: ...; break; 
    case 2: ...; break; 
    default: if(myArray.contains(x)) ... 
    } 

如果not equality conditions将需要在中间,那么它不可能使用开关。

参考:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

+0

+1。非常好的答案。 –