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 つしか使用していませんが、より多くのブール値に拡張できるはずです。続行する他の方法は大歓迎です。

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

多くのブール値がある場合、このソリューションはより適切にスケーリングされます。つまり、各ブール値は 1 ビットを使用しますが、それぞれBooleanが参照であるため、32 ビットまたは最大 32 倍のメモリを使用します。またcardinality()、ビット/ブール値の数に関係なく、実装されています。

于 2013-03-28T10:30:08.013 に答える