Почему мой код сравнивает только первый и последний номер массива — Java

#java #arrays #random #min

#java #массивы #Случайный #мин

Вопрос:

Я хочу получить минимальное количество моего массива, но мое сравнение «если» проверяет только первую и последнюю позиции массива.

Вот мой код:

 int[] randNumbers = new int[20]; //deklaracja nowej tablicy 20-elementowej

Random r = new Random(); // Dodana metoda random do losowania

for(int i=0; i<randNumbers.length; i  ) {
    randNumbers[i] = r.nextInt(101);
    int min = randNumbers[0];

    System.out.println("Number " i ": "    randNumbers[i]);


    if (randNumbers[i] < min) {
        min = randNumbers[i];
    }
    if (i == randNumbers.length-1) {
        System.out.println("Min number is: "   min);
    }
}
  

Ответ №1:

Вам даже не нужен массив здесь. Просто выполните итерацию от 0 до N и проверьте каждое случайное число, если оно меньше min:

 Random r = new Random();
int min = 101;    // assign max value 101 before loop

for(int i = 0; i < 20; i  ) {
    int number = r.nextInt(101);
    System.out.println("Number "   i   ": "    number);
    if (number < min) {
        min = number;
    }
}
System.out.println(min);   
  

Если вы хотите использовать array, вы могли бы инициализировать его раньше. Например, используя Random.ints() :

 int[] randNumbers = new Random().ints(20, 0, 101).toArray();
  

А затем используйте ту же for-loop идею с randNumbers[i] вместо nextInt(101)

Ответ №2:

попробуйте это, ваш int min = randNumbers[0]; сбрасывает минимальное значение каждый раз, поэтому выводите его из цикла

 int min = 100;
for(int i=0; i<randNumbers.length; i  ) {
    randNumbers[i] = r.nextInt(101);
    System.out.println("Number " i ": "    randNumbers[i]);
    if (randNumbers[i] < min) {
          min = randNumbers[i];
    }
}
System.out.println("Min number is: "   min);
  

Ответ №3:

Проблема в том, что вы не запоминаете минимальное число при выполнении цикла. Если вы создадите переменную вне цикла, она не будет обновляться на каждой итерации. Ваш код может выглядеть примерно так:

 int[] randNumbers = new int[20]; //deklaracja nowej tablicy 20-elementowej
Random r = new Random(); // Dodana metoda random do losowania
int min = 0;

for(int i=0; i<randNumbers.length; i  ) {
    int number = r.nextInt(101);
    if(i == 0) min = number;
    randNumbers[i] = number;
    System.out.println("Number " i ": "   number);

    min = Math.min(min, number);
}

System.out.println("Min number is: "   min);
  

Несколько вещей, на которые следует обратить внимание:

  • Переменная min была перемещена за пределы цикла. Это делается для того, чтобы убедиться, что он постоянен во всем цикле и не будет обновляться на каждой итерации цикла.
  • Введена новая переменная number . Это делается для того, чтобы вы не могли постоянно вызывать randNumbers[i] , что выглядит приятнее и, насколько мне известно, немного ускоряет его. Это также упрощает изменение переменной один раз и делает ее эффективной везде, где это необходимо.
  • Последнее S.O.P было перемещено за пределы цикла. Нет смысла проверять, находится ли цикл в последнем элементе, если вы можете просто поместить оператор в строку после завершения цикла. Функционально это будет работать так же, но выглядит приятнее.
  • Вместо того, чтобы использовать if оператор для установки min, он использует вывод Math.min . Это всего лишь косметическое изменение, и оно ведет себя точно так же с if заявлением.

Комментарии:

1. В строке 3 int min = randNumbers[0] , randNumber[0] еще не присвоено значимое значение. Таким образом, присвоение этого неинициализированного значения min, вероятно, изменило бы достоверность результата…

2. @geneSummons совершенно забыл об этом! Спасибо, что обратили на это внимание 🙂

3. Кроме того, как упоминалось в других ответах, «стандартный» способ поиска минимального значения в коллекции — начать с максимально возможного значения в качестве минимального значения по умолчанию. Итак, int min = Integer.MAX_INT было бы более идиоматичным минимальным значением по умолчанию, чем ноль.

4. ^ Это решение, которое я искал. Большое спасибо 🙂 @geneSummons не знал о опции с int min =Integer. Max_Int

5. @Hugoniasty Мой плохой, для Javadocs, статическое поле на самом деле Integer.MAX_VALUE не MAX_INT

Ответ №4:

  1. Переместить min int во внешний цикл со значением 0 не работает, потому что мой результат будет каждый раз, потому что не инициализированный массив имеет только ‘0’
  2. Переместить его на 100 — хорошая идея. Это работает, когда мы знаем максимальное число.
  3. @geneSummons «int min = целое число.MAX_INT» Это очень хорошо работает с разным диапазоном / областью действия чисел 🙂 Спасибо

Кстати. Я все еще не понимаю, почему он сравнивает только первое и последнее число;)

Комментарии:

1. if (randNumbers[i] < min) сравнивает каждое i индексированное значение с минимальным значением, а не только с первым и последним. Что именно вы не понимаете? Вы прошли через свой код, используя отладчик?