Какой самый элегантный способ проверить, являются ли все значения в логическом массиве истинными? - PullRequest
52 голосов
/ 24 ноября 2011

У меня есть логический массив в Java:

boolean[] myArray = new boolean[10];

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

Ответы [ 11 ]

70 голосов
/ 24 ноября 2011
public static boolean areAllTrue(boolean[] array)
{
    for(boolean b : array) if(!b) return false;
    return true;
}
57 голосов
/ 24 июля 2012
Arrays.asList(myArray).contains(false)
17 голосов
/ 23 октября 2015

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

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

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

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

Примечание: Вам необходимо Boolean[], чтобы это решениеРабота.Потому что вы не можете иметь список примитивов.

15 голосов
/ 24 ноября 2011

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

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

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

for (i = 0; i < myArray.length; i++) {
  if (!myArray[i]) return false;
}
return true;
11 голосов
/ 01 июня 2013

Не могу поверить, что нет 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.size()) {
    // do something, there are no false bits in the bitset
}

Другая альтернатива - использование Гуава :

return Booleans.contains(myArray, true);
4 голосов
/ 02 декабря 2017

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

return IntStream.range(0, myArray.length).allMatch(i -> myArray[i]);
3 голосов
/ 09 ноября 2018

Этой строки должно быть достаточно:

BooleanUtils.and(boolean... array)

но чтобы успокоить пуристов только для ссылок:

Выполняет и на множестве логических значений.

2 голосов
/ 24 ноября 2011

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

int i = array.length()-1;
for(; i > -1 && array[i]; i--);
return i==-1
1 голос
/ 15 декабря 2013
boolean alltrue = true;
for(int i = 0; alltrue && i<booleanArray.length(); i++)
   alltrue &= booleanArray[i];

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

0 голосов
/ 06 марта 2017

Вы можете проверить, что все значения имеют значения true или false, сравнив ваш массив с другим логическим массивом с помощью метода 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);
}
...