我在Java中有一个布尔数组:
boolean[] myArray = new boolean[10];
检查所有值是否为真的最优雅方法是什么?
我在Java中有一个布尔数组:
boolean[] myArray = new boolean[10];
检查所有值是否为真的最优雅方法是什么?
public static boolean areAllTrue(boolean[] array)
{
for(boolean b : array) if(!b) return false;
return true;
}
isAllTrue(boolean... array)
。它仍然接受数组,但我们不想限制可能的未来用户。 - Ky -Boolean
(装箱)或者只是不必要地复杂化了。任何强调速度的答案都没有包含任何微基准测试数据,至少能够让人们对其在他们的机器上的表现有个大致的了解。在我看来,保持简单,只需要采用普通方法即可。 - Seth FalcoArrays.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[]
才能使此解决方案正常工作。因为你不能拥有原始类型的列表。
Arrays.asList(myArray).stream().allMatch(Boolean::booleanValue)
可以用于判断全部为true
或全部为false
。 - ccpizza这取决于您需要多少次查找此信息,如果超过一次:
Set<Boolean> flags = new HashSet<Boolean>(myArray);
flags.contains(false);
否则是一个短路循环:
for (i = 0; i < myArray.length; i++) {
if (!myArray[i]) return false;
}
return true;
bool
不是 Java?!而且在每次交互中访问长度 - foreach 更快(至少)。但 Set 的想法很酷 - +1。 - user85421length() - 1
开始并在0处停止可能略微更快,但这甚至不再是微观优化。 - VooO(1)
,而在 ArrayList 中是 O(n)
,因此我提到了 OP 想要多少次查找这些信息。由于 Java 缺乏具体化的泛型,因此还值得提到在 contains 方法中装箱布尔值的成本,但是在任何最近的 JVM 上,这将形成一个 gen 0 可收集对象,成本应该可以忽略不计。也可以通过传递 Boolean.False
来减轻这种情况。 - Rich O'Kelly我简直不敢相信没有 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);
BooleanUtils
,那么它是Apache Commons Lang的一部分,因此您首先必须将其添加为依赖项。此外,这里有一个实现链接,以供任何感兴趣的人参考。 - Seth Falco在Java 8+中,您可以创建一个IntStream
,范围是从0
到myArray.length
,并使用类似以下代码检查相应(原始)数组中的所有值是否为true
:
return IntStream.range(0, myArray.length).allMatch(i -> myArray[i]);
boolean alltrue = true;
for(int i = 0; alltrue && i<booleanArray.length(); i++)
alltrue &= booleanArray[i];
我认为这看起来很好,而且表现良好...
int i = array.length()-1;
for(; i > -1 && array[i]; i--);
return i==-1
您可以通过将您的数组与其他布尔类型的数组比较,使用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);
}