布尔赋值不抓,需要多了解

Boolean assignment not catching, need to understand more

提问人:Tscript 提问时间:6/27/2018 更新时间:6/27/2018 访问量:70

问:

public class MyClass {
     public static void main(String args[]) {
       int[] nums = {1, 2, 9, 3, 4};
       boolean results = false;
       int end = nums.length;
       if (end>4)end=4;
       for (int x=0;x<end;x++)
       {
            System.out.println(nums[x]);
            results = (nums[x] == 9);
       }
       System.out.println(results);
    }
 }

下面的代码检查数组的前 4 个元素中是否存在 9,但如果数组的前 4 个元素中不超过 1 个“9”,则以这种方式使用布尔运算符似乎总是失败。

为什么会这样?从逻辑上讲,这似乎应该有效,当我理解为什么某些东西不起作用时,它确实有助于我更好地理解。

Java 数组 boolean-logic

评论

4赞 EJoshuaS - Stand with Ukraine 6/27/2018
您每次都在覆盖该值。
0赞 Tscript 6/27/2018
是的,这让我看起来很傻。感谢您的正确答案。

答:

5赞 flyingfox 6/27/2018 #1

原因是你已经对所有元素进行了itetate,结果将是最后一个元素的结果,

因此,当您找到匹配结果时,您需要停止for

  for (int x=0;x<end;x++)
   {
        System.out.println(nums[x]);
         if(nums[x] == 9){
          result = true;
          break;
         }
   }

评论

0赞 OldCurmudgeon 6/27/2018
更好使用 - 它避免了不必要的x < end && !resultbreak
0赞 flyingfox 6/27/2018
@OldCurmudgeon我认为这是不必要的,因为如果结果为真,迭代将停止
0赞 EJoshuaS - Stand with Ukraine 6/27/2018
@OldCurmudgeon 这提高了效率,因为如果找到任何 9,循环可以提前结束。否则,你可以像我的回答一样使用。break;results |= (nums[x] == 9);
3赞 EJoshuaS - Stand with Ukraine 6/27/2018 #2

每次都覆盖。正如所写的那样,这将告诉您数组中的最后一项是否等于 9(它没有),而不是数组中的任何项是否等于 9。results

您应该分配给 if ;否则,不要分配任何内容。trueresultnum[x] == 9

@lucumt的回答展示了如何做到这一点的一个例子。再举一个例子,只需将

results = (nums[x] == 9);

results |= (nums[x] == 9);

其中赋值等价于 - 换句话说,如果任何值为 true,则整个表达式将为 true。(请注意,@lucumt 的答案效率略高,因为它是 O(n),而这是 Theta(n) - 即这将始终精确地运行时间,其中是列表的长度,但如果它找到任何 9,@lucumt可以提前结束循环)。|=results = results || (num[x] == 9);nn

评论

1赞 minmaxavg 10/16/2018
请注意,这是 的同义词,而不是另外具有短路行为的同义词。a |= ba = a | ba || b
0赞 Ryan 6/27/2018 #3

在 for 循环中,您每次都会过度写入值。这意味着您正在测试第 4 个值是否等于 9。

您可以像这样解决您的问题:

   boolean results = false;
   for (int x = 0; x < end; x++) {
       System.out.println(nums[x]);
       if(nums[x] == 9) {
           results = true;
           break;
       }
   }
0赞 Michel_T. 6/27/2018 #4

试试这个:

   boolean isPresent(int[] nums, int val)
   {
       for (int x : nums )
       {
            if (nums[x] == val)
              return true;
       }
       return false;
   }

否则,每次检查时都会重写一个值

0赞 Tom 6/27/2018 #5

我给你上了一堂课。如果给定数组的前 4 个元素中的一个或多个包含 9,则 nignPresentInFirst4Elements(int[] arr) 方法返回 true:

public class Test {

   private static boolean nignPresentInFirst4Elements(int[] arr) {
      if(arr == null)
         return false;
      for(int i = 0; i < Math.min(arr.length, 4); i++) {
         if(arr[i] == 9)
            return true;
      }
      return false;
   }

   public static void main(String[] args) {
      int[][] arrs = new int[][] {
         {5, 8, 9, 3},
         {5, 8, 9, 3, 8, 26},
         {5, 8, 9, 9},
         {5, 8, 23, 0}
      };
      for(int i = 0; i < arrs.length; i++) {
         System.out.println(toString(arrs[i]) + " | " + nignPresentInFirst4Elements(arrs[i]));
      }
   }

   private static String toString(int[] arr) {
      if(arr == null)
         return "null";
      String s  = "[";
      if(arr.length > 0)
         s += arr[0];
      for(int i = 1; i < arr.length; i++) {
         s += ", " + arr[i];
      }
      s += "]";
      return s;
   }

}