Java Permutation和布尔标志的组合

时间:2014-12-31 09:35:17

标签: java

我有一些布尔变量将作为参数传递

boolean var1;
boolean var2;
boolean var3;
boolean var4;

根据这些变量,我必须编写类似这样的代码

if (var1 && !var2 && !var3 && !var4) {
  //do something
}
elsif (var1 && var2 && !var3 && !var4) {
  //do something
}

。 。 。 等等..使用所有可能的组合。我可以使用if-else语句来做到这一点。需要知道是否有更好的方法。提前谢谢。

4 个答案:

答案 0 :(得分:3)

从四个布尔参数中构建一个位模式,例如: 0110表示var1 = falsevar2 = truevar3 = truevar4 = 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
}
...
...