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

Vorrei contare il numero di trues, ogni risultato dovrebbe avere la propria azione associata. Forse qualcosa di simile:Contare il numero di "trues" per 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; 
} 

Qualsiasi idea di come scrivere il corpo getResult metodo di un modo abbastanza? Nell'esempio, ho utilizzato solo quattro, ma dovrebbe essere estendibile a un numero maggiore di valori booleani. Qualsiasi altro modo di procedere è il benvenuto.

risposta

10

Scrivere un metodo variadico?

6

Una soluzione migliore potrebbe essere quella di utilizzare un BitSet che può essere più efficiente se si dispone di molti valori booleani.

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

Invece di

boolean a, b, c, d; 

avete BitSet che può avere centinaia o milioni di valori booleani.

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 

Quando si hanno molti booleani, questa soluzione è molto più scalabile. Ad esempio, ogni booleano usa un bit, tuttavia ogni Boolean è un riferimento e quindi utilizza 32 bit o fino a 32 volte la stessa quantità di memoria. Anche cardinality() è implementato per te indipendentemente da quanti bit/booleans hai.

+0

Quattro anni dopo: potresti davvero spiegare come funziona? Come sarebbe 'getResult' essere implementato con un' BitSet'? Sembra interessante ma non capisco come usarlo ... – sp00m

+0

@ sp00m Ho aggiornato la mia risposta. –

Problemi correlati