Нахождение минимального и максимального номера массива

Когда я запускаю эту программу, она находит максимальное число, но всегда печатает 0.0 как минимум.

Когда я использую Double.POSITIVE_INFINITY и Double.NEGATIVE_INFINITY вместо установки наименьшего и наибольшего значения x[0], это работает правильно.

Использование Math.min и Math.max также дает мне ту же ошибку, но работает также с Double.POSITIVE_INFINITY и Double.NEGATIVE_INFINITY. Я просмотрел несколько других подобных вопросов, и мне не разрешается использовать Array.sort или любые другие предложения, которые публикуют люди.

Я просто хочу знать, почему установка обеих переменных на x [0] только когда-либо работает, чтобы найти наибольшее число, независимо от того, объявляю ли я эту переменную первой, второй или устанавливаю ее равной (Двойное наибольшее, наименьшее = x[0]).

public class MaxAndMin {
    public static void main (String[] args) {
        Scanner s= new Scanner(System.in);
        System.out.println("How many numbers would you like to enter?");
        int n= s.nextInt();

        double[] x= new double[n];
        double smallest= x[0]; //double smallest= Double.POSITIVE_INFINITY; 
        double largest= x[0]; //double largest= Double.NEGATIVE_INFINITY;

        for (int i=0; i<x.length; i++) {
            x[i]= kbd.nextDouble();

            if (x[i] > largest) {
                largest = x[i];

            } else if (x[i] < smallest) {
                smallest = x[i];
            }
        }
        System.out.println("Smallest number: " + smallest + " Largest number: " + largest);
    }
}

1 ответ

Решение

Когда вы инициализируете smallest а также largestВы не поместили никаких значений в xпоэтому его элементы - это просто значения по умолчанию, с которыми был создан массив, то есть ноль.

Следовательно, вы найдете только меньший smallest значение, если один меньше нуля (или больше largest значение, если один больше нуля).

Вы должны использовать POSITIVE_INFINITY а также NEGATIVE_INFINITY инициализировать значения, так как все значения меньше и больше, чем они соответственно.


Кроме того, вы можете инициализировать smallest = largest = x[0] в цикле, когда i == 0, Тем не менее, первый подход предпочтительнее, так как он не требует проверки i == 0 на каждой итерации.


В качестве альтернативы, вы можете переместить первое назначение из цикла:

x[0] = smallest = largest = kbd.nextDouble();
for (int i = 1; i<x.length; i++) {
  x[i] = kbd.nextDouble();
  ...

Это позволяет избежать проверки i == 0 неоднократно, но вы должны продублировать kbd.nextDouble(), Я бы все еще использовал первый подход.

Другие вопросы по тегам