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?
public static boolean areAllTrue(boolean[] array)
{
for(boolean b : array) if(!b) return false;
return true;
}
Arrays.asList(myArray).contains(false)
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.
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;
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);
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]);
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.
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
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 ...
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);
}