【问题标题】:Test all values in a boolean[] [duplicate]测试 boolean[] [重复] 中的所有值
【发布时间】:2014-06-03 05:28:29
【问题描述】:

我想知道是否有一种更“简洁”的方法来测试布尔数组中的所有值是否为真/假,而不是像这样遍历数组并单独测试每个值:

for (boolean eval:booleanArray) {
    if (!eval) {
        return false;
    }
}

本质上,我想查看存储在布尔数组中的所有值是否为真,如果是,则执行操作。

我很确定有某种形式的方法可以解决这个问题,比如array.contains(false),但我可能错了。

【问题讨论】:

  • 这是一个匆忙拼凑的例子来说明这一点,但谢谢
  • 提供更多上下文,这是如何使用的?

标签: java arrays


【解决方案1】:

使用番石榴:

正如 SotiriosDelimanolis 指出的那样

// verify all values are true
boolean result = !Booleans.contains(myArray, false);

旧帖...

boolean result = Iterables.all(
         Booleans.asList(myArray),
         Predicates.equalTo(true));

使用静态就变成了:

boolean result = all(asList(myArray), 
                            equalTo(true));

另一个选项是使用集合

boolean result = Sets.newHashSet(Booleans.asList(myArray)).contains(true);

【讨论】:

  • 很酷的解决方案,至少可以说是非标准的!
  • @DenisKulagin LOL,你认为 my 方法很复杂吗?你把我逗乐了。
  • @SotiriosDelimanolis 不正确。工作得很好。 Java 会为您处理 Boolean[] 的演员表。只是试了一下确定。 NP。
  • 对不起,你是对的。我的错。我更新了帖子以使用Booleans.asList
  • 另外,如果你使用Booleans,你可以使用它的contains方法。
【解决方案2】:

使用List 接口。它的工作原理归功于自动装箱的魔力。

List<Boolean> values = new ArrayList<Boolean>();
// ...populate it ...
if(values.contains(false)) {
    //do something
}

【讨论】:

  • 转换为 List 并将原语包装在 Boolean 中以完成如此​​简单的事情。没办法)
  • @DenisKulagin 你不应该从一开始就使用原始数组。
  • @SotiriosDelimanolis 是的。忘记了原始与对象数组转换等。
【解决方案3】:

如果你使用 Java8:

其他一些方法:

long falseCount = Arrays.asList(arr).stream().filter(e -> !e).count();

如果falseCount为0,则表示一切都是真的。

allMatch

boolean allTrue = Arrays.asList(arr).stream().allMatch(e -> e);

但是使用这个系统意味着:

  1. Arrays.asList => 创建一个列表,复制列表中的所有内容
  2. 将基本类型包装成引用类型(布尔值 -> 布尔值)

您的 foreach 方法是最好的方法,但如果您已经在 List 中有项目,为什么不使用它?

【讨论】:

  • OP 使用 Java 8 的大假设
  • 是的,但既然其他人已经说过正确的解决方案,为什么不用其他解决方案有点创意呢?
  • 会在您的帖子中提出一条评论,指出解决方案需要 Java 8。OP 显然是 Java 的新手来提出这个问题。
  • 哦,当我写这个答案时,我添加了“如果你使用 Java8”,但我因为错误而删除了它。谢谢。
  • 假设 arrboolean[] 这个解决方案在 7 或 8 中不起作用。
【解决方案4】:

这绝对是最快的。如果您想整理它 - 提取到一个单独的方法。

public static boolean testAllTrue(boolean[] booleanArray) {
  for (boolean eval : booleanArray) {
    if (!eval) {
        return false;
    }
  }
  return true;
}

【讨论】:

  • 很好,因为它不会像其他解决方案那样产生转换为 Boolean 的成本。只需将boolean expected 作为参数传入即可。
猜你喜欢
  • 2011-10-29
  • 1970-01-01
  • 2020-08-29
  • 2020-10-07
  • 2012-08-03
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 2014-11-27
相关资源
最近更新 更多