我有一些布尔变量将作为参数传递
boolean var1;
boolean var2;
boolean var3;
boolean var4;
根据这些变量,我必须编写类似这样的代码
if (var1 && !var2 && !var3 && !var4) {
//do something
}
elsif (var1 && var2 && !var3 && !var4) {
//do something
}
。 。 。 等等..使用所有可能的组合。我可以使用if-else语句来做到这一点。需要知道是否有更好的方法。提前谢谢。
答案 0 :(得分:3)
从四个布尔参数中构建一个位模式,例如: 0110
表示var1 = false
,var2 = true
,var3 = true
和var4 = false
。
然后,您可以在生成的数字上使用switch
构造。
int b = (var1 ? 8 : 0) | (var2 ? 4 : 0) | (var3 ? 2 : 0) | (var4 ? 1 : 0);
switch(b) {
case 0:
...
case 1:
...
}
答案 1 :(得分:1)
我不认为有更好的方法。这取决于您的代码路径。如果您确实需要2 * 2 * 2 * 2代码路径,则需要在某处编写该代码。要么像你建议的那样制作一个大的if-else块,要么你找到另一种方法指向基于你的标志的实现(策略模式,开关,......)。
答案 2 :(得分:0)
该算法有两个步骤:
第1步。创造N!排列情况,
第2步。在特定情况下,使用De Morgan theorem:
VAR_1 && !VAR_2 && !VAR_3 && ... && !VAR_N = VAR_1 AND !OR(VAR_2, VAR_3, ... VAR_N)
类似,我们还有其他案例:
AND(VAR_1, VAR_2) AND !OR(VAR_3, VAR_4, ..., VAR_N)
AND(VAR_1, VAR_2, VAR_3) AND !OR(VAR_4, VAR5, ..., VAR_N)
...
AND(VAR_1, ..., VAR_(N-1)) AND !OR(VAR_N)
答案 3 :(得分:0)
您无法减少条件数量,但可以使用Arrays.equals
简化此类条件:
boolean var1;
boolean var2;
boolean var3;
boolean var4;
boolean[] varArr = new boolean[]{var1, var2, var3, var4};
if (Arrays.equals(varArr, new boolean[]{false, false, false, false})) {
// handle case1
} else if (Arrays.equals(varArr, new boolean[]{true, false, false, false})) {
// handle case2
} else if (Arrays.equals(varArr, new boolean[]{true, true, false, false})) {
// handle case3
}
...
...