【问题标题】:How to find the average of double values in an array list using a do loop?如何使用 do 循环在数组列表中查找双精度值的平均值?
【发布时间】:2016-10-26 02:01:16
【问题描述】:

我正在创建一个名为 getAveragePrice 的方法,我需要它来计算未定义数组列表中值的平均值(仅在所述方法的测试/实施期间定义)。

    public double getAveragePrice() {
    double sum = 0;
    int x = 0; //counting variable
    do {

这就是我现在的开始。我知道每次将一个值添加到总和时,x 的计数需要增加 1,因此该方法知道将最终总和除以什么。我唯一的问题是如何设置一个 do 循环来给我一个数组列表中的值的总和。

【问题讨论】:

    标签: java arrays loops average do-loops


    【解决方案1】:

    您可以使用 Java 8 流在一行中找到平均值:

    List<Double> vals;
    // initialize vals
    double avg = vals.stream().mapToDouble(Double::doubleValue).sum() / vals.size();
    

    您也可以在此处进行迭代,这需要更多的工作:

    double sum = 0.0;
    for (double val : vals) {
        sum += val;
    }
    
    double avg = vals.size() > 0 ? sum / vals.size() : 0.0d;
    

    【讨论】:

    • 我在想这个。如果你的总和达到无穷大,因为 val 真的很大怎么办?你的 sum / vals.size() 不也是 Infinity 吗?
    • 在总和达到无穷大之前,我认为我们会在 double 中得到某种溢出。
    • 无论如何,它会弄乱平均,不是吗。我可以看到使用 BigDecimal 的唯一解决方案并将其分开。
    【解决方案2】:

    你可以有 do.while 条件为:

    do{
            Sum += arr[x];
            x++;
     }While(x<arr.length)
    

    然后平均:

    Avg = sum/x
    

    【讨论】:

      【解决方案3】:

      您应该遍历列表中的每个元素。

      public double getAveragePrice() {
      double sum = 0;
      int x = 0; //counting variable
          do {
              sum += list.get(x);
              x++;
          } while (x < list.size());
      int average = sum / x;
      return average;
      }
      

      基本上,您从 x = 0 开始循环,每个循环都添加该索引的值,然后将 x 增加 1。然后检查 x 是否小于元素总数。如果是,则列表中还有更多要添加的元素。如果不是,那么您已经对所有元素求和。由于您添加了所有元素,您只需将其除以 x,然后将其作为平均值返回。

      【讨论】:

      • 另一件事:您可能需要检查计数变量是否为零,在空列表的情况下,以避免被零除。
      • 确实如此,但我认为由于 OP 使用的是 do...while 循环,他们可能知道列表不为空,否则 list.get(0) 会抛出错误。跨度>
      • 是的,我在我的回答中部分假设了这一点,这只是一个很好的拥有而不是必须拥有的。
      【解决方案4】:

      您也可以使用 for(each) 代替 do/while:

      List<Double> values; // List<double> is no good apparently
      double average = 0;
      for (Double value : values) {
          average += value.doubleValue(); // I miss PHP ;)
      }
      average /= values.size();
      

      这主要是一种风格上的事情,但当您不关心元素的顺序并且不打算改变其中任何一个。

      这意味着你没有一个你以后实际上不需要的计数器/指针变量(你只关心它在循环期间的值)并且你不会不小心弄乱你的原始数据(' ==' 到 '=' 的错字很经典)。

      注意:我写的 Java 不多,所以也许 foreach 不受欢迎?

      编辑:我没有编写足够的 Java 来正确使用它的集合。

      【讨论】:

      • 你不能使用List&lt;double&gt;,你需要一个object(虽然Java的更高版本可能支持原语列表)。
      • 抱歉,暂时用的是C#。List ?
      【解决方案5】:

      Java 8 无循环解决方案:

      myDoubleList.stream()
        .mapToDouble(Double::doubleValue)
            .average()
            .orElse(Double.NaN);
      

      【讨论】:

        【解决方案6】:

        现在是 21 世纪。无需使用任何循环。使用 Scala & 只需编写

        def exercise5(a: Array[Double]): Double = {
            a.sum / a.length
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-20
          • 1970-01-01
          相关资源
          最近更新 更多