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

sp0*_*00m 6 java boolean count

Boolean a, b, c, d;
Run Code Online (Sandbox Code Playgroud)

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

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

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

Oli*_*rth 12

写一个可变方法?

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


Pet*_*rey 7

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

BitSet bs = new BitSet();
bs.set(1);
bs.set(4);
bs.set(9);
bs.set(16);
int setCount = bs.cardinality(); // 4
Run Code Online (Sandbox Code Playgroud)

代替

boolean a, b, c, d;
Run Code Online (Sandbox Code Playgroud)

你有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
Run Code Online (Sandbox Code Playgroud)

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