Булево присваивание не ловит, надо понимать больше - PullRequest
0 голосов
/ 27 июня 2018
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);
    }
 }

Следующий код проверяет, присутствует ли 9 в первых 4 элементах массива, однако использование логического оператора таким образом, похоже, всегда завершается ошибкой, если в первых 4 элементах не более 1 "9". массива.

Почему это? Логически кажется, что это должно работать, и это действительно помогает мне лучше понять, когда я понимаю, почему что-то не работает.

Ответы [ 5 ]

0 голосов
/ 27 июня 2018

Я написал вам класс. Метод nignPresentInFirst4Elements (int [] arr) возвращает true, если данный массив содержит 9 в одном или нескольких из его первых 4 элементов:

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;
   }

}
0 голосов
/ 27 июня 2018

Попробуйте это:

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

В противном случае вы переписываете значение каждый раз, когда проверяете

0 голосов
/ 27 июня 2018

Вы перезаписываете results каждый раз. Как написано, это скажет вам, равен ли последний элемент в массиве 9 (что не имеет), а не равен ли любой элемент в массиве 9.

Вы должны присвоить true result, если num[x] == 9; в противном случае ничего не назначайте.

@ Ответ lucumt показывает пример того, как это сделать. Еще один пример, просто замените

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

с

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

, где присваивание |= эквивалентно results = results || (num[x] == 9); - другими словами, если любое значение равно true, все выражение будет истинным. (Обратите внимание, что ответ @ lucumt немного более эффективен, потому что это O (n), тогда как это Theta (n) - т.е. это всегда будет выполняться ровно n раз, где n - длина список, но @ lucumt's может досрочно завершить цикл, если найдет 9).

0 голосов
/ 27 июня 2018

В вашем цикле for вы перезаписываете значение каждый раз. Это означает, что вы тестируете, если значение 4th равно 9.

Вы можете решить свою проблему так:

   boolean results = false;
   for (int x = 0; x < end; x++) {
       System.out.println(nums[x]);
       if(nums[x] == 9) {
           results = true;
           break;
       }
   }
0 голосов
/ 27 июня 2018

Причина в том, что вы выполнили итерацию всех элементов, результат будет результатом последнего элемента,

Так что вам нужно остановить for, когда вы найдете результат матча

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