【问题标题】:Finding the lowest double in a Java array查找 Java 数组中的最小双精度数
【发布时间】:2013-01-30 18:57:30
【问题描述】:

我试图从用户输入中获取最低的双倍。我只捕获初始化的 min 变量的值 - 我错过了什么?谢谢!

public static void main(String[] args) {

    double[] lowNum = new double[10];
    Scanner input = new Scanner(System.in);

    for (int i=0; i<=9; i++) {
        System.out.println("Enter a double: ");
        lowNum[i] = input.nextDouble();
    }
    input.close();
    double min = calcLowNum(lowNum);
    System.out.println(min);
}


public static double calcLowNum(double[] a) {
    double min=0;
    for (int i=0; i>=9; i++){
      for (int j=0; j>=9; j++){
          if (a[i]<=a[j] && j==9){
              min=a[i];
          }
          else {
              continue;
      }
    }
    }

    return min;

【问题讨论】:

  • 尝试用自然顺序对它们进行排序,在这种情况下,最小的数字在第一个位置,最大的数字在最后一个位置
  • @anfy2002us:充其量是O(n logn),而在O(n) 中很容易找到最小值。
  • 您似乎根本不需要数组。我会记住输入的最小数字,而不是记住所有数字。顺便说一句:最低的意思是最接近负无穷大?

标签: java arrays for-loop


【解决方案1】:

您可以只使用Collections#min 来找到最小值。不过,您需要Apache Commons-Lang

// This would be the array 'a'
double[] array = {15, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

// Convert the primitive array into a Class array
Double[] dArray = ArrayUtils.toObject(array);
List<Double> dList = Arrays.asList(dArray);

// Find the minimum value
Double returnvalue = Collections.min(dList);

return returnvalue; // or you can do returnvalue.doubleValue() if you really want

【讨论】:

    【解决方案2】:

    首先,将i&gt;=9j&gt;=9改为i&lt;=9j&lt;=9

    for (int i=0; i>=9; i++){
      for (int j=0; j>=9; j++){
    

    否则,您的循环实际上是无操作的。

    一个更健壮的方法是像这样编写循环:

    for (int i = 0; i < a.length; i++) {
    

    或者像这样:

    for (double val : a) {
    

    最后,只需遍历数组一次,将每个元素与当前最小值进行比较,即可找到最小值(但请确保适当地初始化 min!)

    【讨论】:

    • 更传统的for (int i = 0; i &lt; 10; i++) {
    • 谢谢。我忽略了我的错别字。
    【解决方案3】:

    如果您确实需要存储所有输入,而不是找到最小、最简单的方法来使用库函数对数组进行排序:

    ...
    //sorting array, so first element will be the lowest
    Arrays.sort(lownum);
    
    double min = lownum[0];
    

    我同意 Peter Lawree 你实际上并不需要所有的数组;您需要保存第一个输入,并将以下所有内容与其进行比较,如果较低则存储:

    double lastInput=0, min=0;
    for (int i=0; i<=9; i++) {
       System.out.println("Enter a double: "); 
       lastInput = input.nextDouble();
       if (0==i) {
           //if this is first iteration, save first input as min
           min=lastInput;
       } else {
           if (lastInput<min) min=lastInput;
       }
    }
    return min;
    

    附:实际上,您应该使用 Double.compare 来比较双打。因此,如果输入数量不大,则使用 Arrays.sort() 的示例会更好,在这种情况下,第一个示例将花费更多的内存和时间来执行。

    更新:Java8 解决方案

    double findMin(double[] input) {
     return Arrays.stream(input).min().getAsDouble();
    }
    

    【讨论】:

    • min = (i == 0 || lastInput &lt; min) ? lastInput : min;
    【解决方案4】:

    OMG,遍历数组 - 这是最糟糕的解决方法(但我糟糕的英语比它更糟糕)。查看http://code.google.com/p/guava-libraries/ 这个库包含满足您需要的健壮代码(事实上,您的项目中必须有库)。您可以查看和分析来源 - 它是免费的,但您在最佳实践中的经验将随着我的英语技能的增长而增长。 以下是番石榴代码示例:

      public static double min(double... array) {
        checkArgument(array.length > 0);
        double min = array[0];
        for (int i = 1; i < array.length; i++) {
          min = Math.min(min, array[i]);
        }
        return min;
      }
    

    P.S:使用标准代码学习库,不要重新发明轮子。开心点!

    【讨论】:

    • 谢谢 - 我不得不将迭代作为一个学习过程,但我喜欢你所说的。我想变得有效率。再次感谢。
    猜你喜欢
    • 2018-07-09
    • 2020-03-07
    • 2021-08-22
    • 2019-07-13
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多