2013-03-28 2 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 тело метода симпатичную путь? В этом примере я использовал только четыре, но он должен быть расширен до большего количества булевых. Любой другой способ продолжения приветствуется.

ответ

10

Напишите вариационный метод?

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

Лучшим решением может быть использование BitSet, который может быть более эффективным, если у вас много логических значений.

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, которые могут иметь сотни или миллионы логических значений.

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

+0

@ sp00m Я обновил свой ответ. –

Смежные вопросы