即。没有选项(全是假的) 仅限选项1 选项1和选项2 选项1和选项2和选项3 仅限选项2 选项2和选项3 仅限选项3 等
我需要检查所有组合,但我没有 我想写一大堆if else if语句。
有没有办法可以获得结果应该是什么 是
类似
result = option1 & option2 & option3
然后我可以进入switch语句 处理正确的组合
如果您需要更详细的解释,请与我们联系。 提前谢谢。
P.S。我在这里要做的是避免拥有 这么多if if if语句并使我的代码看起来 更清洁,设计更好。所以如果你能想到的话 另一种方式,我很感激。
由于
答案 0 :(得分:2)
您可以为每个可能的结果生成Karnaugh_map,使用其规则,您可以将特定条件集的逻辑简化为可能的最小值。
但是我认为最好是为了清晰,尝试遵循逻辑流程来解释为什么要采用某些分支。如果它太复杂,可能需要重新考虑情况。
答案 1 :(得分:0)
我的解决方案不适用于布尔值,但您可以调整它。例如,调用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);
}
}
}
答案 2 :(得分:0)
在交换机中获取所有8个案例的一种方法如下:
将布尔值转换为不同的int标志(仅设置一个位的值),将这些值与按位OR组合,然后打开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个案例。但如果添加更多的布尔值,它将会失控,因为组合的数量呈指数级增长。