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

Tôi muốn đếm số lượng, mỗi kết quả sẽ có hành động liên quan của riêng nó. Có thể một cái gì đó như:Đếm số "trues" cho n booleans

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

Bất kỳ ý tưởng nào về cách viết cơ thể phương pháp getResult một cách đẹp? Trong ví dụ này, tôi đã sử dụng chỉ bốn, nhưng nó phải được mở rộng thành số lượng lớn các boolean. Bất kỳ cách nào khác để tiến hành đều được chào đón.

Trả lời

10

Viết phương pháp variadic?

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

Một giải pháp tốt hơn có thể là sử dụng BitSet có thể hiệu quả hơn nếu bạn có nhiều giá trị boolean.

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

Thay vì

boolean a, b, c, d; 

bạn có BitSet mà có thể có hàng trăm hoặc hàng triệu các giá trị boolean.

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 

Khi bạn có nhiều boolean, giải pháp này sẽ tốt hơn nhiều. tức là mỗi boolean sử dụng một bit, tuy nhiên mỗi Boolean là một tham chiếu và do đó sử dụng 32-bit hoặc lên đến 32x nhiều bộ nhớ. Ngoài ra cardinality() được thực hiện cho bạn cho dù bạn có bao nhiêu bit/boolean.

+0

Bốn năm sau: bạn có thể giải thích cách hoạt động của nó không? Làm thế nào 'getResult' được thực hiện với một' BitSet'? Có vẻ thú vị nhưng tôi không hiểu cách sử dụng nó ... – sp00m

+0

@ sp00m Tôi đã cập nhật câu trả lời của mình. –