Побитовая операция Java И несколько логических значений - PullRequest
1 голос
/ 21 июня 2011

это моя проблема. У меня есть три логических, которые Есть варианты, которые я могу иметь. Я могу иметь несколько комбинации с тремя вариантами:

т.е. нет вариантов (все ложно) только вариант 1 вариант 1 и вариант 2 вариант 1 и вариант 2 и вариант 3 только вариант 2 вариант 2 и вариант 3 только вариант 3 и т.д.

Мне нужно проверить все комбинации, но я не хочу написать тонны операторов if else if.

Есть ли способ получить то, что результаты должны быть?

что-то вроде

result = option1 & option2 & option3

и тогда я могу просто перейти в операторе switch обработать правильную комбинацию

Дайте мне знать, если вам нужно более подробное объяснение. Заранее спасибо.

p.s. что я пытаюсь сделать здесь, чтобы избежать так много, если еще, если заявления и заставить мой код выглядеть чище и лучше разработан. Так что, если вы можете думать о другой способ сделать, я был бы признателен.

Спасибо

Ответы [ 3 ]

2 голосов
/ 21 июня 2011

Вы можете сгенерировать Karnaugh_map для каждого возможного результата, используя его правила, вы можете просто логически для определенного набора условий до минимума потенциально.

Однако я думаю, что это такЛучше всего пойти для ясности, попробуйте следовать логике, чтобы понять, почему определенные ветки взяты.Если это слишком запутанно, возможно, переосмыслите ситуацию в порядке.

0 голосов
/ 22 июня 2011

Один из способов получить доступ ко всем 8 случаям в коммутаторе заключается в следующем.

Преобразуйте логические значения в различные int-флаги (значения, для которых установлен только один бит), объедините их с побитовым ИЛИ и затем включите 8 возможных значений.

int combination = (option1 ? 1 : 0) | (option2 ? 2 : 0) | (option3 ? : 4 : 0);

switch(combination) {
case 0: // !1 && !2 && !3
  ...
break;
case 1: // 1 && !2 && !3
  ...
break;
case 2: // !1 && 2 && !3
  ...
break;
case 3: // 1 && 2 && !3
  ...
break;
case 4: // !1 && !2 && 3
  ...
break;
case 5: // 1 && !2 && 3
  ...
break;
case 6: // !1 && 2 && 3
  ...
break;
case 7: // 1 && 2 && 3
  ...
break;
}

При таком подходе вы можете обрабатывать все 8 случаев одинаково. Но он будет расти из рук, если будет добавлено больше логических значений, потому что количество комбинаций растет в геометрической прогрессии.

0 голосов
/ 22 июня 2011

Мое решение не работает с логическими значениями, но вы можете его адаптировать. Например, вызов Option.CombinedOption.get (Option.ONE, Option.THREE) возвращает перечисление CombinedOption.OPTION_1_3.

public enum Option {
ONE, TWO, THREE;

public enum CombinedOption {

    ALL_FASLSE(), OPTION_1(ONE), OPTION_1_2(ONE, TWO), OPTION_1_3(ONE,
            THREE), OPTION_1_2_3(ONE, TWO, THREE), OPTION_2(TWO), OPTION_2_3(
            TWO, THREE), OPTION_3(THREE);

    private Set<Option> keySet;

    private CombinedOption(Option... options) {
        if (options != null && options.length > 0)
            keySet = EnumSet.copyOf(Arrays.asList(options));
        else
            keySet = EnumSet.noneOf(Option.class);

    }

    private static final Map<Set<Option>, CombinedOption> optionMapping = new HashMap<Set<Option>, CombinedOption>();

    static {
        for (CombinedOption combined : CombinedOption.values()) {
            optionMapping.put(combined.keySet, combined);
        }
    }

    public static CombinedOption get(Option... options) {
        Set<Option> keySet;

        if (options != null && options.length > 0)
            keySet = EnumSet.copyOf(Arrays.asList(options));
        else
            keySet = EnumSet.noneOf(Option.class);

        return optionMapping.get(keySet);
    }
}

}

...