我有 5 个布尔变量 a、b、c、d 和 e。因此,对于每个变量的真假的每种不同组合,都有不同的打印语句。
比如说:
abcde --- 打印语句
TTTTT -- 打印全部为真
TTTTF -- 打印一些文本
TTTFF -- 打印一些其他文本
...........
可能有 32 种不同的可能组合。我正在写一个java代码。所以问题是对于每个条件都应该打印出不同的语句。那么处理这个问题的最佳解决方案是什么,而不是让代码更加混乱和难以管理的常规 if 语句呢?
我有 5 个布尔变量 a、b、c、d 和 e。因此,对于每个变量的真假的每种不同组合,都有不同的打印语句。
比如说:
abcde --- 打印语句
TTTTT -- 打印全部为真
TTTTF -- 打印一些文本
TTTFF -- 打印一些其他文本
...........
可能有 32 种不同的可能组合。我正在写一个java代码。所以问题是对于每个条件都应该打印出不同的语句。那么处理这个问题的最佳解决方案是什么,而不是让代码更加混乱和难以管理的常规 if 语句呢?
一种选择是基本上构建一个位掩码:
int mask = (a ? 1 : 0) |
(b ? 2 : 0) |
(c ? 4 : 0) |
(d ? 8 : 0) |
(e ? 16 : 0);
System.out.println(statements[mask]);
...statements
长度为 32 的数组在哪里。所以在你的情况下,statements[31]
将是“All trues”,statements[30]
将是“Some Text”等。
解释true
为位设置和false
位未设置。这样,您可以将所有组合映射到 int 值 0 .. 31。
比简单地定义
String[] outputs = new String[32]{"text 1", "text2", ... , "text 31"};
而不是打印outputs[bitconstallation]
为什么不概括您的位掩码函数以传递任意数量的布尔值(可能使用 BigDecimal 会更好 -> 满足特定需求):
/**
* Gets all the boolean combinations in the array of booleans.
*
* @param booleans
* @return
*/
public static int getBooleanCombinations(final boolean... booleans) {
int res = 0;
for (int n = 0; n < booleans.length; n++) {
final double pow = Math.pow(2, n);
final boolean bool = booleans[n];
final Double localres = Double.valueOf(bool ? pow : 0);
res = localres.intValue() | res;
}
return res;
}