2015-12-01 112 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]; 
    } 
} 

结合这两种循环类型但它感觉更像是偶然。

相关问题