计算数组列表的平均值?

use*_*306 46 java arrays average

我正在尝试使用以下代码来计算用户输入的一组值的平均值,并将其显示在a中,jTextArea但它无法正常工作.比如,用户输入7,4和5,程序显示1作为应显示5.3的平均值

  ArrayList <Integer> marks = new ArrayList();
  Collections.addAll(marks, (Integer.parseInt(markInput.getText())));

  private void analyzeButtonActionPerformed(java.awt.event.ActionEvent evt) {
      analyzeTextArea.setText("Class average:" + calculateAverage(marks));
  }

  private int calculateAverage(List <Integer> marks) {
      int sum = 0;
      for (int i=0; i< marks.size(); i++) {
            sum += i;
      }
      return sum / marks.size();
  }
Run Code Online (Sandbox Code Playgroud)

代码有什么问题?

Jes*_*run 64

当你有增强的for循环时,为什么要使用带索引的笨拙的for循环?

private double calculateAverage(List <Integer> marks) {
  Integer sum = 0;
  if(!marks.isEmpty()) {
    for (Integer mark : marks) {
        sum += mark;
    }
    return sum.doubleValue() / marks.size();
  }
  return sum;
}
Run Code Online (Sandbox Code Playgroud)

  • 我会在开始时检查marks.size()== 0,如果列表为空则将除以零 (5认同)
  • 我喜欢java,但是当你这样做时,你必须错过C#的list.Average()函数:p (3认同)

Mar*_*ana 63

使用Java 8,它更容易一些:

OptionalDouble average = marks
            .stream()
            .mapToDouble(a -> a)
            .average();
Run Code Online (Sandbox Code Playgroud)

因此你的平均值是average.getAsDouble()

return average.isPresent() ? average.getAsDouble() : 0; 
Run Code Online (Sandbox Code Playgroud)

  • `average.isPresent()?average.getAsDouble():defaultValue`可以进一步简化为`optional.orElse(defaultValue)` (17认同)

rob*_*ins 26

如果使用Java8,您可以从List中获取值的平均值,如下所示:

    List<Integer> intList = Arrays.asList(1,2,2,3,1,5);

    Double average = intList.stream().mapToInt(val -> val).average().orElse(0.0);
Run Code Online (Sandbox Code Playgroud)

这具有不具有移动部件的优点.通过更改map方法调用,可以轻松地调整它以使用其他类型对象的List.

例如双打:

    List<Double> dblList = Arrays.asList(1.1,2.1,2.2,3.1,1.5,5.3);
    Double average = dblList.stream().mapToDouble(val -> val).average().orElse(0.0);
Run Code Online (Sandbox Code Playgroud)

NB.mapToDouble是必需的,因为它返回一个具有average方法的DoubleStream ,而使用map则没有.

或BigDecimals:

@Test
public void bigDecimalListAveragedCorrectly() {
    List<BigDecimal> bdList = Arrays.asList(valueOf(1.1),valueOf(2.1),valueOf(2.2),valueOf(3.1),valueOf(1.5),valueOf(5.3));
    Double average = bdList.stream().mapToDouble(BigDecimal::doubleValue).average().orElse(0.0);
    assertEquals(2.55, average, 0.000001);
}
Run Code Online (Sandbox Code Playgroud)

使用orElse(0.0)average"不存在" 返回的Optional对象中删除问题.


Emm*_*urg 14

使用double作为总和,否则你正在进行整数除法,你不会得到任何小数:

private double calculateAverage(List <Integer> marks) {
    if (marks == null || marks.isEmpty()) {
        return 0;
    }

    double sum = 0;
    for (Integer mark : marks) {
        sum += mark;
    }

    return sum / marks.size();
}
Run Code Online (Sandbox Code Playgroud)

或使用Java 8流API:

    return marks.stream().mapToInt(i -> i).average().orElse(0);
Run Code Online (Sandbox Code Playgroud)


Ry-*_*Ry- 10

sum += i;
Run Code Online (Sandbox Code Playgroud)

你正在添加索引; 你应该在以下内容中添加实际项目ArrayList:

sum += marks.get(i);
Run Code Online (Sandbox Code Playgroud)

此外,要确保不截断返回值,请强制使用一个操作数double并将方法签名更改为double:

return (double)sum / marks.size();
Run Code Online (Sandbox Code Playgroud)

  • 因为他正在使用列表,所以你应该使用`sum + = marks.get(i);` (3认同)

Say*_*Pal 5

使用Guava,它在语法上得到了简化:

Stats.meanOf(numericList);
Run Code Online (Sandbox Code Playgroud)