2016-04-20 2 views
0

Когда я запускаю эту программу, он находит максимальное число, но всегда печатает 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); 
    } 
} 
+2

'x [0] == 0', так как элементы новых двойных массивов инициализируются нулем. –

ответ

2

При инициализации 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(). Я бы по-прежнему использовал первый подход.

+0

Спасибо, имеет смысл. Я попытался ввести отрицательное число и заметил, что он работал, как только я опубликовал, но не понял почему. :) – anna