Каков самый элегантный способ проверить, истинны ли все значения в булевом массиве?

У меня есть boolean массив в java:

boolean[] myArray = new boolean[10];

Какой самый элегантный способ проверить, истинны ли все значения?

Ответ 1

public static boolean areAllTrue(boolean[] array)
{
    for(boolean b : array) if(!b) return false;
    return true;
}

Ответ 2

Arrays.asList(myArray).contains(false)

Ответ 3

Это зависит от того, сколько раз вы захотите найти эту информацию, если не один раз:

Set<Boolean> flags = new HashSet<Boolean>(myArray);
flags.contains(false);

В противном случае короткий цикл:

for (i = 0; i < myArray.length; i++) {
  if (!myArray[i]) return false;
}
return true;

Ответ 4

В Java 8 вы можете сделать:

boolean isAllTrue = Arrays.asList(myArray).stream().allMatch(val -> val == true);

Или даже короче:

boolean isAllTrue = Arrays.stream(myArray).allMatch(Boolean::valueOf);

Примечание: Для этого решения вам нужно Boolean[]. Потому что у вас нет списка примитивов.

Ответ 5

Я не могу поверить, что нет BitSet.

A BitSet является абстракцией по набору битов, поэтому нам больше не нужно использовать boolean[] для более сложных взаимодействий, поскольку он уже содержит большинство необходимых методов. Он также довольно быстро работает в пакетных операциях, так как он внутренне использует значения long для хранения бит и, следовательно, не проверяет каждый бит отдельно, как мы делаем с boolean[].

BitSet myBitSet = new BitSet(10);
// fills the bitset with ten true values
myBitSet.set(0, 10);

В вашем конкретном случае я бы использовал cardinality():

if (myBitSet.cardinality() == myBitSet.length()) {
    // do something, there are no false bits in the bitset
}

Другой альтернативой является Guava:

return Booleans.contains(myArray, true);

Ответ 6

OK. Это "самое изящное" решение, которое я мог бы найти на лету:

boolean allTrue = !Arrays.toString(myArray).contains("f");

Надеюсь, что это поможет!

Ответ 7

Это, вероятно, не быстрее и, безусловно, не очень читаемо. Итак, ради красочных решений...

int i = array.length()-1;
for(; i > -1 && array[i]; i--);
return i==-1

Ответ 8

В Java 8+ вы можете создать IntStream в диапазоне от 0 до myArray.length и проверить, что все значения true в соответствующем (примитивном) массиве имеют что-то вроде

return IntStream.range(0, myArray.length).allMatch(i -> myArray[i]);

Ответ 9

boolean alltrue = true;
for(int i = 0; alltrue && i<booleanArray.length(); i++)
   alltrue &= booleanArray[i];

Я думаю, что это выглядит нормально и ведет себя хорошо...

Ответ 10

Я предполагаю, что единственный способ - итерация.

for(i = 0; i < myArray.length; i++){
    if(!myArray[i]){
        return false;
    }
}

return true;

Ответ 11

Вы можете проверить, что все значения являются истинными или ложными, сравнивая ваш массив с другим булевым массивом с помощью метода Arrays.equal, как показано ниже:

private boolean isCheckedAnswer(List<Answer> array) {
    boolean[] isSelectedChecks = new boolean[array.size()];
    for (int i = 0; i < array.size(); i++) {
        isSelectedChecks[i] = array.get(i).isChecked();
    }

    boolean[] isAllFalse = new boolean[array.size()];
    for (int i = 0; i < array.size(); i++) {
        isAllFalse[i] = false;
    }

    return !Arrays.equals(isSelectedChecks, isAllFalse);
}