2014-12-31 6 views
5

ich einige boolean Variablen haben, dieJava Permutation und Kombination von Booleschen Flags

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

In Abhängigkeit von diesen Variablen als Argumente übergeben werden, ich habe etwas Code wie diesen

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

. . . und so weiter .. mit allen möglichen Kombinationen. Ich kann dies mit der if-else-Anweisung tun. Müssen Sie wissen, gibt es einen besseren Ansatz. Danke im Voraus.

+0

Sie werden 2^4 Kombinationen haben. Du könntest einen Schalter benutzen. – WannaBeCoder

+2

Dies wurde teilweise hier diskutiert: http://stackoverflow.com/questions/20659979/use-an-array-as-a-case-statement-in-switch/20660201 –

Antwort

3

Erstellen Sie ein Bitmuster aus den vier booleschen Argumenten, z. 0110 bedeutet var1 = false, var2 = true, var3 = true und var4 = false.

Dann können Sie das switch Konstrukt auf den generierten Zahlen verwenden.

int b = (var1 ? 8 : 0) | (var2 ? 4 : 0) | (var3 ? 2 : 0) | (var4 ? 1 : 0); 
switch(b) { 
    case 0: 
     ... 
    case 1: 
     ... 
} 
1

Ich glaube nicht, dass es einen besseren Ansatz gibt. Es hängt von Ihren Codepfaden ab. Wenn Sie wirklich 2 * 2 * 2 * 2 Codepfade benötigen, müssen Sie diesen Code irgendwo schreiben. Entweder Sie erstellen einen großen if-else-Block, wie Sie es vorschlagen, oder Sie finden einen anderen Weg, auf eine Implementierung zu verweisen, die auf Ihren Flags basiert (Strategie-Pattern, Switch, ..).

0

Der Algorithmus besteht aus 2 Schritten:

Schritt 1. Erstellen Sie N! Permutationsfälle,

Schritt 2. In konkreten Fall mit De Morgan theorem:

VAR_1 && !VAR_2 && !VAR_3 && ... && !VAR_N = VAR_1 AND !OR(VAR_2, VAR_3, ... VAR_N) 

ähnlich, wir haben andere Fall:

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) 
0

Sie können nicht mehrere Bedingungen reduzieren, aber die Bedingungen, wie dies mit Arrays.equals vereinfachen kann:

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 
} 
... 
...