[英]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 = 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:
...
}
我認為沒有更好的方法。 這取決於您的代碼路徑。 如果確實需要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.