计算n个布尔值的“真实”数量

时间:2013-03-28 10:10:54

标签: java count boolean

Boolean a, b, c, d;

我想算一下trues的数量,每个结果都应该有自己的关联动作。也许是这样的:

int result = getResult(a, b, c, d);
switch (result) {
    case 0: break;
    case 1: break;
    case 2: break;
    case 3: break;
    default: break;
}

如何以一种漂亮的方式编写getResult方法体?在这个例子中,我只使用 四,但它应该可以扩展到更多的布尔值。欢迎任何其他方式继续。

2 个答案:

答案 0 :(得分:12)

写一个可变方法?

int getResult(boolean... vars) {
    int count = 0;
    for (boolean var : vars) {
        count += (var ? 1 : 0);
    }
    return count;
}

答案 1 :(得分:7)

更好的解决方案可能是使用BitSet,如果你有很多布尔值,它可以更高效esp。

BitSet bs = new BitSet();
bs.set(1);
bs.set(4);
bs.set(9);
bs.set(16);
int setCount = bs.cardinality(); // 4

而不是

boolean a, b, c, d;

你有BitSet,它可以有数百或数百个布尔值。

BitSet bs = new BitSet(4);
bs.set(0); // a
bs.set(1); // b
bs.set(2); // c
bs.set(3); // d
int setCount = bs.cardinality(); // 4

如果你有很多布尔值,这个解决方案可以更好地扩展。即每个布尔值使用一位,但每个Boolean是一个引用,因此使用32位或高达32倍的内存。无论你有多少比特/布尔值,你都会实现cardinality()