2016-04-20 179 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]只能用於查找最大數字,無論我是首先聲明該變量,第二次還是將其設置爲相等(Double largest,smallest = 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

當初始化smallestlargest,你還沒有把任何值到x,所以它的元素是剛纔那個數組創建默認值,即零。

因此,如果一個值小於零(或者如果一個大於零的值大於largest),則只會找到較小的smallest值。

您應該使用POSITIVE_INFINITYNEGATIVE_INFINITY來初始化這些值,因爲所有值分別小於和大於這些值。


或者,您可以initalize在smallest = largest = x[0] for循環時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