私はJavaでブール配列を持っています:
boolean[] myArray = new boolean[10];
すべての値が真であるかどうかを確認する最もエレガントな方法は何ですか?
public static boolean areAllTrue(boolean[] array)
{
for(boolean b : array) if(!b) return false;
return true;
}
Arrays.asList(myArray).contains(false)
Java 8では、次のことができます。
boolean isAllTrue = Arrays.asList(myArray).stream().allMatch(val -> val == true);
またはさらに短く:
boolean isAllTrue = Arrays.stream(myArray).allMatch(Boolean::valueOf);
注:必要ですBoolean[]
このソリューションが機能するため。プリミティブリストを作成できないためです。
複数回の場合、この情報を検索する回数に依存します。
Set<Boolean> flags = new HashSet<Boolean>(myArray);
flags.contains(false);
それ以外の場合、短絡ループ:
for (i = 0; i < myArray.length; i++) {
if (!myArray[i]) return false;
}
return true;
BitSet
解決策がないとは信じられません。
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
}
_
別の選択肢は Guava を使用することです:
_return Booleans.contains(myArray, true);
_
Java 8+では、0
からmyArray.length
の範囲でIntStream
を作成し、すべての値がtrue
であることを確認できます。次のような対応する(プリミティブ)配列、
return IntStream.range(0, myArray.length).allMatch(i -> myArray[i]);
これはおそらく高速ではなく、間違いなく非常に読みやすいものではありません。だから、カラフルなソリューションのために...
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];
私はこれは大丈夫に見え、うまく動作すると思います...
以下の例のようなArrays.equal
メソッドを使用して、配列を他のブール配列と比較することにより、すべての値項目がtrueまたはfalseであることを確認できます。
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);
}