检查布尔数组中的所有值是否为真的最优雅的方法是什么?

don*_*ner 54 java arrays boolean

我在java中有一个布尔数组:

boolean[] myArray = new boolean[10];
Run Code Online (Sandbox Code Playgroud)

检查所有值是否为真的最优雅的方法是什么?

Eng*_*uad 71

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

  • 这可能是个人偏好,但我会使用`isAllTrue(boolean ... array)`以防将来需要或需要该方法的其他输入.它仍然接受数组,但我们不希望限制可能的未来用户. (14认同)

bas*_*ode 64

Arrays.asList(myArray).contains(false)
Run Code Online (Sandbox Code Playgroud)

  • 只有当它是布尔[]而不是布尔[]时,它才有效.因为你不能有一个带有基元的List,你最终会得到带有List <boolean []>的Arrays.asList(boolean []),它永远不会包含false,因为它总是包含数组. (22认同)
  • 一个班轮,清晰,简洁,O(n)查找,这里有什么不喜欢的? (3认同)

Kap*_*rma 20

在Java 8中,您可以:

boolean isAllTrue = Arrays.asList(myArray).stream().allMatch(val -> val == true);
Run Code Online (Sandbox Code Playgroud)

甚至更短:

boolean isAllTrue = Arrays.stream(myArray).allMatch(Boolean::valueOf);
Run Code Online (Sandbox Code Playgroud)

注意: 您需要Boolean[]此解决方案才能工作.因为你不能有一个基元列表.

  • `Arrays.asList(myArray).stream().allMatch(Boolean :: booleanValue)`将适用于所有`true`和所有`false`. (5认同)

Ric*_*lly 15

这取决于您多次想要查找此信息,如果不止一次:

Set<Boolean> flags = new HashSet<Boolean>(myArray);
flags.contains(false);
Run Code Online (Sandbox Code Playgroud)

否则是短路循环:

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

  • -1因为顶部示例没有编译:`需要意外类型:找到引用:boolean` (3认同)

Pet*_*ček 11

我无法相信没有BitSet解决方案.

A BitSet是对一组位的抽象,因此我们不再需要boolean[]用于更高级的交互,因为它已经包含了大多数所需的方法.它在批处理操作中也相当快,因为​​它在内部使用long值来存储位,因此不像我们那样单独检查每个位boolean[].

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

对于您的具体情况,我会使用cardinality():

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

另一种方法是使用番石榴:

return Booleans.contains(myArray, true);
Run Code Online (Sandbox Code Playgroud)


Ell*_*sch 5

在 Java 8+ 中,您可以IntStream0to范围内创建一个myArray.length并检查所有值是否都true在相应的(原始)数组中,例如,

return IntStream.range(0, myArray.length).allMatch(i -> myArray[i]);
Run Code Online (Sandbox Code Playgroud)


Ger*_*ica 5

该行应足够:

BooleanUtils.and(boolean... array)

但要平息仅链接的纯粹主义者:

对一组布尔值执行和。

  • 为了让那些无法访问“BooleanUtils”的人感到困惑,它是 [Apache Commons Lang](https://commons.apache.org/proper/commons-lang/) 的一部分,所以你'必须首先将其添加为依赖项。另外,这里还有一个[实现](https://github.com/apache/commons-lang/blob/master/src/main/java/org/apache/commons/lang3/BooleanUtils.java#L92=)的链接任何好奇的人) (2认同)