web-dev-qa-db-fra.com

Quel est le moyen le plus élégant de vérifier si toutes les valeurs d'un tableau booléen sont vraies?

J'ai un tableau booléen en Java:

boolean[] myArray = new boolean[10];

Quelle est la manière la plus élégante de vérifier si toutes les valeurs sont vraies?

52
donturner
public static boolean areAllTrue(boolean[] array)
{
    for(boolean b : array) if(!b) return false;
    return true;
}
70
Eng.Fouad
Arrays.asList(myArray).contains(false)
59
basilikode

Dans Java 8, vous pourriez faire:

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

Ou même plus court:

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

Note: Vous avez besoin de Boolean[] pour que cette solution fonctionne. Parce que vous ne pouvez pas avoir une liste de primitives.

17
Kapil Sharma

Cela dépend du nombre de fois où vous voudrez trouver cette information, si plus d'une fois:

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

Sinon, une boucle court-circuitée:

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

Je ne peux pas croire qu'il n'y a pas de solution BitSet .

Un BitSet est une abstraction sur un ensemble de bits, nous n'avons donc plus besoin d'utiliser boolean[] Pour des interactions plus avancées, car il contient déjà la plupart des méthodes nécessaires. C'est aussi assez rapide dans les opérations par lots car il utilise en interne long valeurs pour stocker les bits et ne vérifie donc pas chaque bit séparément comme nous le faisons avec boolean[].

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

Pour votre cas particulier, je voudrais utiliser cardinality() :

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

Une autre alternative consiste à utiliser Guava :

return Booleans.contains(myArray, true);
11
Petr Janeček

Dans Java 8+, vous pouvez créer un IntStream dans la plage de 0 à myArray.length et vérifiez que toutes les valeurs sont true dans le tableau (primitif) correspondant avec quelque chose comme,

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

Cette ligne devrait suffire:

BooleanUtils.and(boolean... array)

mais pour calmer les puristes de lien seulement:

Effectue un et sur un ensemble de booléens.

3
Gerold Broser

Ce n'est probablement pas plus rapide, et certainement pas très lisible. Donc, pour des solutions colorées ...

int i = array.length()-1;
for(; i > -1 && array[i]; i--);
return i==-1
2
Miquel
boolean alltrue = true;
for(int i = 0; alltrue && i<booleanArray.length(); i++)
   alltrue &= booleanArray[i];

Je pense que cela a l'air bien et se comporte bien ...

1
Patrick

Vous pouvez vérifier que tous les éléments de valeur sont vrais ou faux en comparant votre tableau avec l'autre tableau booléen via Arrays.equal méthode comme exemple ci-dessous:

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);
}
0
Huy Tower