我在 java 中有一个布尔数组:
boolean[] myArray = new boolean[10];
检查所有值是否为真的最优雅的方法是什么?
public static boolean areAllTrue(boolean[] array) { for(boolean b : array) if(!b) return false; return true; }
这取决于你想找到这些信息的次数,如果不止一次:
Set<Boolean> flags = new HashSet<Boolean>(myArray); flags.contains(false);
否则就是一个短路的循环:
for (i = 0; i < myArray.length; i++) { if (!myArray[i]) return false; } return true;
好吧,这是我能马上想到的“最优雅”的解决方案:
boolean allTrue = !Arrays.toString(myArray).contains("f");
希望能帮上忙!
这可能不会更快,也肯定不是很容易阅读。因此,为了丰富多彩的解决方案..。
int i = array.length()-1; for(; i > -1 && array[i]; i--); return i==-1
Arrays.asList(myArray).contains(false)
真不敢相信没有 BitSet解决方案。
BitSet
BitSet是一组位的抽象,因此我们不必再使用 boolean[]进行更高级的交互,因为它已经包含了大多数所需的方法。它在批处理操作中也非常快,因为它在内部使用 long值来存储位,因此不像我们对 boolean[]那样单独检查每一位。
boolean[]
long
BitSet myBitSet = new BitSet(10); // fills the bitset with ten true values myBitSet.set(0, 10);
对于你的特殊情况,我会使用 cardinality():
cardinality()
if (myBitSet.cardinality() == myBitSet.size()) { // do something, there are no false bits in the bitset }
另一种选择是使用 番石榴:
return Booleans.contains(myArray, true);
boolean alltrue = true; for(int i = 0; alltrue && i<booleanArray.length(); i++) alltrue &= booleanArray[i];
我觉得这看起来不错,表现也不错。
在 Java8中,你可以这样做:
boolean isAllTrue = Arrays.asList(myArray).stream().allMatch(val -> val == true);
或者更短:
boolean isAllTrue = Arrays.stream(myArray).allMatch(Boolean::valueOf);
注: 这个解决方案需要 Boolean[]才能正常工作,因为不能使用原语 List。
Boolean[]
你可以通过 Arrays.equal方法比较你的数组和其他布尔数组来检查所有值项是真或假,如下例所示:
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); }
在 Java8 + 中,您可以在 0到 myArray.length的范围内创建一个 IntStream,并检查所有值是否都是相应(原语)数组中的 true,如下所示,
0
myArray.length
IntStream
true
return IntStream.range(0, myArray.length).allMatch(i -> myArray[i]);
这句话应该足够了:
BooleanUtils.and(boolean... array)
而是为了安抚只有链接的纯粹主义者:
在一组布尔值上执行 an 和。
科特林: 如果一个元素为 false,则不会选择所有元素
return list.filter { isGranted -> isGranted.not() }.isNotEmpty()