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)
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)
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)
| 归档时间: |
|
| 查看次数: |
156786 次 |
| 最近记录: |