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

我想要計算trues的數量,每個結果都應該有自己的相關操作。也許是這樣的:計算n個布爾值的「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方法體一個漂亮的方式嗎?在這個例子中,我使用只有四,但它應該擴展到更多的布爾值。歡迎任何其他方式繼續。

回答

10

寫一個可變的方法?

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

更好的解決方案可能是使用,如果你有很多布爾值,可以更有效尤指位集合。

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 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()

+0

四年後:你真的可以解釋這是如何工作的嗎? 'getResult'如何用'BitSet'實現?看起來有趣,但我沒有得到如何使用它... – sp00m 2017-06-21 09:13:54

+0

@ sp00m我已經更新了我的答案。 – 2017-06-21 17:31:49