2

我有 5 个布尔变量 a、b、c、d 和 e。因此,对于每个变量的真假的每种不同组合,都有不同的打印语句。

比如说:

abcde --- 打印语句

TTTTT -- 打印全部为真

TTTTF -- 打印一些文本

TTTFF -- 打印一些其他文本

...........

可能有 32 种不同的可能组合。我正在写一个java代码。所以问题是对于每个条件都应该打印出不同的语句。那么处理这个问题的最佳解决方案是什么,而不是让代码更加混乱和难以管理的常规 if 语句呢?

4

3 回答 3

9

一种选择是基本上构建一个位掩码:

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 tr​​ues”,statements[30]将是“Some Text”等。

于 2013-01-23T18:30:08.927 回答
1

解释true为位设置和false位未设置。这样,您可以将所有组合映射到 int 值 0 .. 31。

比简单地定义

String[] outputs = new String[32]{"text 1", "text2", ... ,  "text 31"};

而不是打印outputs[bitconstallation]

于 2013-01-23T18:30:22.303 回答
1

为什么不概括您的位掩码函数以传递任意数量的布尔值(可能使用 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;
}
于 2014-11-14T10:33:09.387 回答