2015-12-01 169 views
-2

我試圖找到具有十個輸入點的數組的最小值,但我以某種方式設法創建了只能找到最大值的東西。幫幫我?找到一個數組的最小值

import java.util.Scanner; 

public class Ex7_9Smallestt { 

    public static void main(String[] args) { 

     Scanner input = new Scanner(System.in); 
     int count = 0; 

     System.out.print("Welcome to Elisabeth's smallest number finder!\n"); 
     //print welcome message 

     double myList [] = new double[10]; //initialize array 

     while (count < 10) { //initialize for loop 
      //print enter a number and make that number an element in the array 
      int i = 0; 
      System.out.print("\nPlease enter a number:"); 
      myList[i] = input.nextDouble(); 
      count ++; 
     } 

     System.out.printf("The minimum is " + min(myList)); //print minimum 
    } 

    public static double min(double[] array) { 
     //create method to find lowest number 

     double minimum = array[0]; 
     int i = 0; 

     //initialize for loop 
     for (double e : array) { 
      if (array[i] < minimum) { 
       minimum = array[i]; 
       i++; 
      } 
     } 
     return minimum; 
    } 
} 
+0

爲什麼在min方法中混合循環索引和集合?爲什麼不迭代數組並忘記索引? – ncmathsadist

回答

0

首先,你不正確地填寫你的數組。目前您有

int i = 0; 
System.out.print("\nPlease enter a number:"); 
myList[i] = input.nextDouble(); 
count ++; 

發生在每次迭代。因此,您將i設置爲零,並且每次都存儲myList[i],所以您只需一遍又一遍地填充myList[0]。相反,循環直到count < myList.length並使用myList[count]在每個索引處分配一個值。

其次,您在最小查找方法中無緣無故地使用for-each循環。因爲你使用i來索引你的數組,所以我會把它改成普通的循環。

0

首先,簡單地使用println()方法而不是print\n字符更容易,看起來好多了。

此外,爲什麼不提示用戶Enter 10 values:並使用for loop代替int i<10

min()你基本上是在增強的for loop內創建一個專門的for loop。這是不必要的。徹底擺脫int i。 此外,您只是相對於下一個元素進行排序。你需要檢查它是絕對的最小值。

我會從使用array切換到ArrayList<int>注意:> <>中的所有內容都是類型參數化器;通常,您可以使用E作爲佔位符,使其成爲通用算法(該方法可以使用擴展接口的任何數據類型)。這樣一來,你可以使用一個迭代器,並使用更高效的算法:

import java.util.Collection; 
import java.util.Iterator; 
import java.util.List; 

public static<Integer extends Comparable<Integer>> Integer findMin(Collection<Integer> c) { 
    Iterator<Integer> i=c.iterator(); 
    Integer current=i.next(); 
    Integer min=current; 
    Integer next; 

    while(i.hasNext()){ 
     next=i.next(); 
     if(min.compareTo(next)>0){ 
      min=next; 
     } 
    } 
    return min; 
} 

編輯:對不起,我誤解你的代碼;只需在我的代碼中將Integer的每個實例替換爲您的double即可。

1

如果你使用了這樣的循環再

for (double candidate : array) { 
    if (candidate < minimum) { 
    minimum = candidate; 
    } 
} 

比混合通過索引訪問更好。

@Test public void min() { 
    double[] array = new double[4]; 

    array[0] = 5; 
    array[1] = 2; 
    array[2] = 3; 
    array[3] = 7; 

    double min = array[0]; 

    for (double candidate : array) { 
     if (candidate < min) { 
      min = candidate; 
     } 
    } 

    assertEquals(2, min, 0.05); 
} 

你的例子是失敗,但因爲你只有遞增,如果我的第一個元素實際上是少本身(即從來沒有)......通過努力出來的紙質支票通過循環的第一次迭代。

與您的代碼這樣的工作

for(double e: array){ 
    if(array[i] < minimum){ 
     minimum = array[i]; 

    } 
    i++; 
} 

,但你可以看到不混合通過索引訪問是更可讀,而且也不易出錯。

2
for(double e: array){ 
    if(array[i] < minimum){ 
     minimum = array[i]; 
    } 
    i++; 
} 

上面會工作,而你的下面不工作。

for(double e: array){ 
    if(array[i] < minimum){ 
     minimum = array[i]; 
     i++; 
    } 
} 

原因很簡單。在所有情況下,您都不會增加i,所以它會卡住並一遍又一遍地比較相同的元素。它沒有返回最大值,大部分時間是第一個元素。

你不需要i但由於您使用增強的for循環,這意味着正確的做法是

for(double e: array) { 
    if(e < minimum) { 
     minimum = e; 
    } 
} 

或者,如果你喜歡i

for (int i = 0; i < array.length; i++) { 
    if (array[i] < minimum) { 
     minimum = array[i]; 
    } 
} 

結合這兩種循環類型但它感覺更像是偶然。

相關問題