2017-02-22 52 views
0

Я создаю скрипт, который отображает результаты в зависимости от выбранных параметров.Изменение длинной if/else на короткую логику карты

Я использую: А, В, С, D, Е, F, G, Н (в будущем будет больше)

int A = 0; 
int B = 0; 
int C = 0; 
int D = 0; 
int E = 0; 
int F = 0; 
int G = 0; 
int H = 0; 

окончательным Ансвер будет одним из 16 комбинации.

A;C;E;G = Nr1 
A;C;E;H = Nr2 
A;C;F;G = Nr3 
A;C;F;H = Nr4 
A;D;E;G = Nr5 
A;D;E;H = Nr6 
A;D;F;G = Nr7 
A;D;F;H = Nr8 
B;C;E;G = Nr9 
B;C;E;H = Nr10 
B;C;F;G = Nr11 
B;C;F;H = Nr12 
B;D;E;G = Nr13 
B;D;E;H = Nr14 
B;D;F;G = Nr15 
B;D;F;H = Nr16 

Я хочу показать потенциальные варианты.
При нажатии комбинации: A, C' then answer is '"Nr1,Nr2,Nr3,Nr4"
При нажатии комбинации: A, G' then answer is '"Nr1,Nr3,Nr5,Nr7"
Позже будет больше переменных I, J, K, L .... и т.д. Но ответы будут только шестнадцатый

Что может быть логикой для структуры данных A, такой как Map, я немного застрял?

Важно - комбинации могут быть созданы также смешивать случаи , например: H;C;E;A или E;C;A;H .... и т.п. ответ будет Nr1

If/Else кажется слишком долго. в настоящее время код:

String scoreTeamA = "waiting for the results"; 


    if (A == 1) { 
     if (C == 1) { 
      if (E == 1) { 
       if (G == 1) { 
        scoreTeamA = "The answer is: Nr1"; //combination: A;C;E;G 
       } else if (H == 1) { 
        scoreTeamA = "The answer is: Nr2"; //combination: A;C;E;H 
       } else scoreTeamA = "Possible variants, one of: Nr1, Nr2"; //combination: A;C;E 

      } else if (F == 1) { 
       if (G == 1) { 
        scoreTeamA = "The answer is: Nr3"; //combination: A;C;F;G 
       } else if (H == 1) { 
        scoreTeamA = "The answer is: Nr4"; //combination: A;C;F;H 
       } else scoreTeamA = "Possible variants, one of: Nr3,Nr4"; //combination: A;C;F 

      } else scoreTeamA = "Possible variants, one of: Nr1,Nr2,Nr3,Nr4"; //combination: A;C; 

     } else if (D == 1) { 
      scoreTeamA = "Possible variants, one of: Nr5,Nr6,Nr7,Nr8";//combination: A;D; 
     } else 
      scoreTeamA = "Possible variants, one of: Nr1,Nr2,Nr3,Nr4,Nr5,Nr6,Nr7,Nr8"; //combination: A 
    } else if (B == 1) { 
     scoreTeamA = "Possible variants, one of: Nr9,Nr10,Nr11,Nr12,Nr13,Nr14,Nr15,Nr16"; //combination: B 
    } 
+0

Я вижу четыре двоичных переменных. Используйте дерево. – Compass

+0

@ HypnicJerk и @Compass Я могу сократить количество переменных; до 4 ('A, B, C, D'), тогда я получаю каждый из этих элементов 3 значения' -1; 0; 1' –

+0

Возможно, это ['BitSet'] (http://docs.oracle.com/javase/8/docs/api/java/util/BitSet.html), поскольку здесь будет показано представление для любой комбинации букв. Затем вы можете использовать «Map » для получения ответов. – Seelenvirtuose

ответ

0

Создать POJO. Boolean все еще работает, потому что вы можете выбрать null. Когда выбрано a, значение true. Когда b выбрано, b является ложным. Нет выбора null.

Мы можем заполнить наши варианты использования этого https://stackoverflow.com/a/27008250/2958086

List<Option> option = new ArrayList<>(); 
final int n = 4; 
for (int i = 0; i < Math.pow(2, n); i++) { 
    String bin = Integer.toBinaryString(i); 
    while (bin.length() < n) 
     bin = "0" + bin; 
    char[] chars = bin.toCharArray(); 
    boolean[] boolArray = new boolean[n]; 
    for (int j = 0; j < chars.length; j++) { 
     boolArray[j] = chars[j] == '0' ? true : false; 
    } 
    list.add(new Option(boolArray, i+1)); //create this constructor 
} 

Затем искать:

List<String> findValues(Boolean a, Boolean c, Boolean e, Boolean g) { 
    List<String> values = new ArrayList<>(); 

    for(Option option : options) { 
     if(option.isValid(a, c, e, g)) 
      values.add(option.getValue()); 
    } 
    return values;  
} 

Применение:

List<String> myValues = findValues(true, false, null, null); // selects all filings that are AD** 

Любой VAL которые заполняются нулем, пройдут любые значения, которые не будут сравниваться с их соответствующими значениями.