【问题标题】:Handling Multiple Boolean Combinations处理多个布尔组合
【发布时间】:2013-01-07 08:18:25
【问题描述】:

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

比如说:

a b c d e --- 打印语句

T T T T T -- 打印所有真值

T T T T F -- 打印一些文本

T T T F F -- 打印一些其他文本

........

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

【问题讨论】:

  • 如果要打印的文本与您的示例中的一样,则无需嵌套 if:for (boolean b : booleans) b ? out("T") : out("F");。预期的输出是否比这更复杂?

标签: java boolean combinations boolean-logic


【解决方案1】:

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

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”等。

【讨论】:

    【解决方案2】:

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

    比简单定义

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

    然后打印outputs[bitconstallation]

    【讨论】:

      【解决方案3】:

      为什么不概括您的位掩码函数以传递任意数量的布尔值(可能使用 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;
      }
      

      【讨论】:

        猜你喜欢
        • 2012-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        • 1970-01-01
        • 2015-02-04
        • 2016-11-21
        相关资源
        最近更新 更多