8
Boolean a, b, c, d;

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

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

知道如何以getResult漂亮的方式编写方法体吗?在示例中,我使用了四个,但它应该可以扩展到更多的布尔值。欢迎任何其他方式进行。

4

3 回答 3

13

写一个可变参数方法?

int getResult(boolean... vars) {
    int count = 0;
    for (boolean var : vars) {
        count += (var ? 1 : 0);
    }
    return count;
}
于 2013-03-28T10:12:44.230 回答
8

如果您有许多布尔值,更好的解决方案可能是使用可能更有效的 BitSet。

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()无论您有多少位/布尔值,也为您实现。

于 2013-03-28T10:30:08.013 回答
0

这是一个老歌......但这是另一种方式:

int count = Stream.of(b1, b2, b3).filter(b -> b).count();
于 2022-02-16T15:24:53.663 回答