Java:将所有可能的TRUE / FALSE组合添加到列表中

时间:2015-03-10 09:58:05

标签: java loops boolean generator

我已经看过其他关于此的帖子,但它们并不完全像这个问题。

我有这段代码:

    public static List<Boosters.Builder> GetBoosters() {
    List<Boosters.Builder> boosters = new ArrayList<Boosters.Builder>();

    Boosters.Builder booster = new Boosters.Builder();

    booster.setLarge(Bool.TRUE).setMedium(Bool.TRUE).setSmall(Bool.TRUE);
    boosters.add(booster);

    booster.setLarge(Bool.FALSE).setMedium(Bool.TRUE).setSmall(Bool.FALSE);
    boosters.add(booster);

    booster.setLarge(Bool.TRUE).setMedium(Bool.FALSE).setSmall(Bool.TRUE);
    boosters.add(booster);

    booster.setLarge(Bool.TRUE).setMedium(Bool.TRUE).setSmall(Bool.FALSE);
    boosters.add(booster);

    // (etc, etc, etc)

    return boosters;
}

这是我在Java中使用的一些生成类型的一部分。但是Bool.TRUE / Bool.FALSE有点像普通的java布尔值,所以你可以指望它。

我正在尝试创建一个循环,它将为我提供所有可能的TRUE / FALSE组合:

booster.setLarge(Bool.TRUE).setMedium(Bool.TRUE).setSmall(Bool.TRUE);

我无法弄清楚如何在循环中很好地做到这一点。有人可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

使用Bool#values()迭代枚举的可能值:

for (Bool large : Bool.values())
   for (Bool medium : Bool.values())
        for (Bool small : Bool.values())
              boosters.add(new Boosters.Builder().setLarge(large).setMedium(medium).setSmall(small));

答案 1 :(得分:0)

一种方法是运行从02^n的整数(不包括) - 其中n是您需要分配的变量数。

然后,您可以使用(x >> k) % 2来获取变量号k的值。

这仅适用于少于64个值(使用long变量)。

       for (int x =0; x < 1<<k; x++) { 
            int val1 = (x >> 0) %2;
            int val2 = (x >> 1) %2;
            int val3 = (x >> 2) %2;
            ...
            System.out.println("" + val1 + "," + val2 + "," + val3);
        }

请注意,通过将long切换为数组,可以轻松地将此方法修改为任意数量的变量(适合val1,val2,...)。