【问题标题】:Find the average within variable number of doubles在可变数量的双打中找到平均值
【发布时间】:2012-05-09 12:39:10
【问题描述】:

我有一个双精度数的 ArrayList,我需要找到所有数字之间的平均值。 arraylist 中 Double 实例的数量不是恒定的,可以是 2,也可以是 90 我已经尝试了几个小时来自己获得算法,但无论如何都无法让它发挥作用。

你有什么建议吗?或者你可以把我链接到一个现有的图书馆来得到这个平均值?

谢谢

【问题讨论】:

    标签: java arraylist double average


    【解决方案1】:

    创建一个sum 变量:

    double sum = 0;
    

    使用 for 循环遍历列表中的元素:

    for (double d : yourList)
    

    在每次迭代中,将当前值添加到sum

        sum += d;
    

    在循环之后,为了求平均值,将sum 除以列表中的元素数:

    double avg = sum / yourList.size();
    

    这里适合所有认为这太简单的人...

    上述解决方案其实并不完美。如果列表中的前几个元素非常大而最后一个元素很小,则由于双精度,sum += d 可能不会在最后产生影响。

    解决方案是在进行平均计算之前对列表进行排序:

    Collections.sort(doublesList);
    

    现在将首先添加小元素,以确保它们都被尽可能准确地计算并有助于最终总和:-)

    【讨论】:

      【解决方案2】:

      如果你喜欢直播:

      List<Number> list = Arrays.asList(number1, number2, number3, number4);
      
      // calculate the average
      double average = list.stream()
                           .mapToDouble(Number::doubleValue)
                           .average()
                           .getAsDouble();
      

      【讨论】:

        【解决方案3】:

        平均值的定义是所有值的总和除以值的个数。循环遍历这些值,将它们相加,然后将总和除以列表的大小。

        【讨论】:

          【解决方案4】:

          如果“所有数字之间的平均值”是指列表中所有双打的平均值,您可以简单地将列表中的所有双打相加(使用循环),然后将总数除以列表中的双打数.

          【讨论】:

            【解决方案5】:

            你试过了吗:

            List<Double> list = new ArrayList<Double>();
            ...    
            double countTotal = 0;
            
            for (Double number : list)
            {
                countTotal += number;
            }
            
            double average = countTotal / list.size();
            

            【讨论】:

              【解决方案6】:

              也许我没有得到这个问题……但不是这样的?

              double sum = 0.0;
              for (double element : list) {
                  sum += element;
              }
              double average = sum / list.size();
              

              【讨论】:

                【解决方案7】:

                如果您担心将整个列表加在一起时会溢出,您可以使用运行平均值。因为它的操作比较多,所以会比把所有的东西加起来再除一次要慢。

                for (int x = 0; x < list.size(); x++)
                   average = (average / (x+1)) * (x) + list.get(x) / (x+1);
                

                【讨论】:

                • 在精度方面也不是很好。
                猜你喜欢
                • 2016-05-21
                • 2021-11-20
                • 1970-01-01
                • 1970-01-01
                • 2018-07-24
                • 2021-08-23
                • 1970-01-01
                • 2022-10-09
                • 1970-01-01
                相关资源
                最近更新 更多