簡體   English   中英

Java排列和布爾標志的組合

[英]Java Permutation and Combination of boolean flags

我有一些布爾變量將作為參數傳遞

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

根據這些變量,我必須編寫類似這樣的代碼

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

等等..使用所有可能的組合。 我可以使用if-else語句來做到這一點。 需要知道是否有一些更好的方法。 提前致謝。

根據四個布爾參數構建位模式,例如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:
      ...
}

我認為沒有更好的方法。 這取決於您的代碼路徑。 如果確實需要2 * 2 * 2 * 2代碼路徑,則需要在某個地方編寫該代碼。 您可以像建議的那樣創建一個很大的if-else塊,或者找到另一種方法來根據您的標志(策略模式,開關等)指向實現。

該算法有2個步驟:

步驟1 創建N! 排列案例

第二步 在特定情況下,使用De Morgan定理

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)

您不能減少條件數量,但是可以使用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
}
...
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM