【问题标题】:How to check ALL elements of a boolean array are true如何检查布尔数组的所有元素是否为真
【发布时间】:2013-09-09 00:32:57
【问题描述】:

我有一个布尔数组,其大小取决于随机选择的字符串的大小。

所以我有这样的事情:

boolean[] foundLetterArray = new boolean[selectedWord.length()];

随着程序的进行,这个特殊的布尔数组会被数组中每个元素的真实值填充。我只想在数组的所有元素都为真后立即打印一条语句。所以我试过了:

if(foundLetterArray[selectedWord.length()]==true){
    System.out.println("You have reached the end");
}

这给了我一个越界异常错误。我也尝试过 contains() 方法,但即使数组中的 1 个元素为真,也会结束循环。我是否需要一个遍历数组所有元素的 for 循环?我该如何设置测试条件?

【问题讨论】:

  • 数组索引从 0 开始,所以最后一个元素是 foundLetterArray[selectedWord.length() - 1]== true 也有点多余;您不需要将真值与另一个进行比较,而是可以直接将其用作条件。
  • 你需要一个循环来检查是否所有的元素都是true。在循环中遇到第一个false 元素时可以停止。
  • 干杯,伙计们。这解决了越界问题,但如果只有最后一个元素为真,则此 if 语句假定整个数组为真。关于如何解决这个问题的任何想法?例如,如果所有元素都是假的,最后一个元素是真的,它会说“你已经到了尽头”。真的吗?还是我又做错了什么?

标签: java arrays boolean


【解决方案1】:

使用增强的for循环,您可以轻松遍历数组,无需索引和大小计算:

private static boolean allTrue (boolean[] values) {
    for (boolean value : values) {
        if (!value)
            return false;
    }
    return true;
}

【讨论】:

  • 检查整个数组后,如何使用此方法打印“您已到达结束”语句?我不明白这个循环。
  • 可以用这个方法来检查你的数组:System.out.println("到达终点,全部为真:"+allTrue(foundLetterArray));
  • 我可以使用 if 语句吗?像 if(allTrue(foundLetterArray)==true){System.out.print("End reahed");
  • 是的,甚至更短:if(allTrue(foundLetterArray)){System.out.print("End reahed");
  • 我不知道增强的for循环,我不明白,但我已经通过反复试验让它工作了!谢谢彼得!我的程序现已完成。
【解决方案2】:

有一个 Java 8 单行代码:

boolean allTrue(boolean[] arr) {
    return IntStream.range(0, arr.length).allMatch(i -> arr[i]);
}

【讨论】:

    【解决方案3】:

    boolean[] foundLetterArray = new boolean[5]; abow 数组的内存分配是这样的

          foundLetterArray[0],foundLetterArray[1],foundLetterArray[2],foundLetterArray[3],foundLetterArray[4] 
    

    数组索引从0开始,总内存为5,最后一个数组索引为4。

    您正在尝试获取不存在的 foundLetterArray[5] 的索引 5。这就是为什么你会收到ArrayIndexOutofBoundsException

       if(foundLetterArray[selectedWord.length()-1]==true){
          System.out.println("You have reached the end");
       }
    

    【讨论】:

      【解决方案4】:

      Java 中的数组从index 0 开始,最后一个索引总是[array.length()-1]

      当您检查 foundLetterArray[selectedWord.length()] 时,它会为您提供一个超出 Bound Exception 的数组尝试 foundLetterArray[selectedWord.length()-1]

      喜欢:

      if(foundLetterArray[selectedWord.length()-1]){
      System.out.println("You have reached the end");
      }
      

      【讨论】:

        【解决方案5】:

        Java 以及大多数编程语言中的索引都是从 0 开始的,这意味着具有 n 个元素的数组中的各个元素的索引为 0、1、2、...、n-1。数组中的最后一个元素始终位于索引 array.length - 1。

        【讨论】:

          【解决方案6】:

          数组索引从 0 开始,所以最后一个索引总是比数组长度小 1,所以在这里你试图通过 findLetterArray[selectedWord.length()] 访问最后一个索引 + 1,所以它在 ArrayIndexBoundEception 使用 array.lastIndex( ) 方法或减去 1 个表单长度。

          实现这个foundLetterArray[selectedWord.length()-1] 如果你的数组不包含任何元素,那么你必须注意一件事,然后 selectedWord.length() 返回 0 并且你会再次得到相同的异常,所以在执行此操作之前检查长度是很好的 foundLetterArray[selectedWord.length()-1] .

          【讨论】:

            【解决方案7】:

            这样做

            public boolean allTrue(boolean[] array) {
                for (boolean b : array) {
                    if (!b) {
                       return false;
                    }
                }
                return true;
            }
            

            没有“一行”的方法可以知道数组的所有元素是否满足特定条件(有一些库会为您处理循环,但您仍然需要编写条件)。查询 array[x] 只会告诉您该数组中的第 x 个项目,因此对于您的问题,您需要检查每个项目。

            另外,正如其他人所指出的,数组索引是从 0 开始的,所以第一个元素位于 array[0],最后一个元素位于 array[array.length() - 1]。

            我的示例使用称为 for-each 的备用循环结构。当您不需要修改数组内容时,这是合适的,您只需要从中读取。它避免了索引的任何混乱。

            【讨论】:

              【解决方案8】:

              你只检查数组中的最后一个元素(做错了,上面描述了原因)。

              为了得到数组是否只包含真值,你应该检查所有的值。

              boolean allAreTrue = true;
              for (boolean val : foundLetterArray) {
                allAreTrue = allAreTrue && val;
              }
              

              // 在这一行 allAreTrue 将包含 true 如果所有值都为 true,如果您至少有一个 "false" 则为 false

              【讨论】:

              • 这是低效的,因为如果遇到错误值它不会停止。
              • 不,这对初学者来说根本不可读。教授糟糕的代码对任何人都没有好处。
              猜你喜欢
              • 2021-03-12
              • 2023-03-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-06-17
              • 1970-01-01
              • 2012-01-05
              相关资源
              最近更新 更多