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

Chciałbym policzyć liczbę prawdziwych zobowiązań, każdy wynik powinien mieć własne powiązane działanie. Może coś takiego:Policz liczbę "zobowiązań" dla 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; 
} 

Każdy pomysł, jak napisać ciału getResult metoda ładny sposób? W tym przykładzie użyłem tylko cztery, ale powinien być rozszerzalny na większą liczbę booleans. Każdy inny sposób postępowania jest mile widziany.

Odpowiedz

10

Napisz metodę wariadyczną?

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

Lepszym rozwiązaniem może być użycie zestawu bitowego, który może być bardziej wydajny, jeśli masz wiele wartości boolowskich.

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

Zamiast

boolean a, b, c, d; 

masz BitSet które mogą mieć setki lub miliony wartości logicznych.

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 

Kiedy masz dużo booleans, to rozwiązanie skaluje się znacznie lepiej. tj. każda boolowska wykorzystuje jeden bit, jednak każdy Boolean jest odniesieniem, a zatem wykorzystuje 32-bitowe lub 32-krotnie więcej pamięci. Również cardinality() jest zaimplementowany bez względu na to, ile masz bitów/boolean.

+0

Cztery lata później: czy mógłbyś wyjaśnić, jak to działa? W jaki sposób można uzyskać 'getResult' przy użyciu' BitSet'? Wygląda interesująco, ale nie rozumiem, jak z niego korzystać ... – sp00m

+0

@ sp00m Zaktualizowałem moją odpowiedź. –