2013-03-28 12 views
6
Boolean a, b, c, d; 

私は真理の数を数えたいと思います。多分何かのように:n個のブール値の "真理値"の数を数えてください

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つしか使用しませんでしたが、より多くのブール値に拡張可能である必要があります。進める他の方法は歓迎です。

答えて

10

可変メソッドを記述しますか?

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

ブーリアン値が多い場合は、より効率的なBitSetを使用する方がよい場合があります。代わりに

boolean a, b, c, d; 

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

あなたはブール値の数百または数百万を持つことができた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()が実装されています。

+0

4年後:実際にこの方法が説明できますか? 'getResult'は' BitSet'でどのように実装されますか?興味深いですが、私はそれを使用する方法を取得していません... – sp00m

+0

@ sp00m私は私の答えを更新しました。 –

関連する問題