#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:
- Переместить min int во внешний цикл со значением 0 не работает, потому что мой результат будет каждый раз, потому что не инициализированный массив имеет только ‘0’
- Переместить его на 100 — хорошая идея. Это работает, когда мы знаем максимальное число.
- @geneSummons «int min = целое число.MAX_INT» Это очень хорошо работает с разным диапазоном / областью действия чисел 🙂 Спасибо
Кстати. Я все еще не понимаю, почему он сравнивает только первое и последнее число;)
Комментарии:
1.
if (randNumbers[i] < min)
сравнивает каждоеi
индексированное значение с минимальным значением, а не только с первым и последним. Что именно вы не понимаете? Вы прошли через свой код, используя отладчик?