找到一个数组的最小值

时间:2015-12-01 01:39:54

标签: java arrays numbers minimum

我正在尝试找到具有十个输入点的数组的最小值,但是我设法创建了一些只能找到最大值的数组。帮助

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;
    }
}

4 个答案:

答案 0 :(得分: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];
    }
}

将两种循环类型结合起来可以起作用,但感觉更像是偶然的。

答案 1 :(得分:1)

如果你使用像那样的for循环那么

render: function() {
    return(
        <div className={this.getClass()}>Example</div>
    );
}

比通过索引混合访问更好。

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

你的例子失败了,因为如果第一个元素实际上小于它本身(即从不),你的唯一递增i ...通过在纸上处理它来检查循环的第一次迭代。

使用您的代码可以使用

@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);
}

但你可以看到,不通过索引混合访问更具可读性,并且更不容易出错。

答案 2 :(得分: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循环。我会将其更改为正常的for循环,因为无论如何都使用i索引到数组中。

答案 3 :(得分:0)

首先,简单地使用println()方法而不是print并使用\n字符会更容易看起来更好。

另外,为什么不提示用户Enter 10 values:并使用for loop int i<10

min()中,您实际上是在增强型for loop内创建了一个临时for loop。这是不必要的。彻底摆脱int i。 此外,您只是相对于下一个元素进行排序。您需要检查它是否是绝对最小值。

我会从使用array切换到ArrayList<int>注意:&lt;&gt;中的所有内容是一个类型参数化器;通常,您可以使用E作为占位符,使其成为通用算法(该方法可以使用扩展Comparable接口的任何数据类型)。这样,您可以使用迭代器,并使用更有效的算法:

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中的每个实例。