import java.util.ArrayList;
public class Variance {
// Copy here sum from exercise 63
public static int sum(ArrayList<Integer> list) {
int sum = 0;
for(int i=0; i<list.size(); i++ ){
sum = sum + list.get(i) ;
}
return sum;
}
// Copy here average from exercise 64
public static double average(ArrayList<Integer> list) {
double average = sum(list)/list.size();
return average;
}
public static double variance(ArrayList<Integer> list) {
// write code here
double sumMinusAverage = sum(list) - average(list);
return sumMinusAverage * sumMinusAverage / (list.size()-1);
}
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(3);
list.add(2);
list.add(7);
list.add(2);
System.out.println("The variance is: " + variance(list));
}
}
该程序正在计算方差。但是当列表包含相同的数字等时1-s。程序说方差是3,但答案应该是0。
有人可以给我一些指导。
答案 0 :(得分:5)
整数除法Luiggi Mendoza已经提到过你需要解决的一个问题,但另外,你计算方差的算法是不正确的。它不是分子中和与平均值之差的平方。
您必须总结各个元素与平均值的差异。除以(list.size() - 1)
对样本差异是正确的。
public static double variance(ArrayList<Integer> list) {
double sumDiffsSquared = 0.0;
double avg = average(list);
for (int value : list)
{
double diff = value - avg;
diff *= diff;
sumDiffsSquared += diff;
}
return sumDiffsSquared / (list.size()-1);
}
列表中只有一个项目时要小心。方差应为0
,但您需要检查大小以避免被零除异常。
此外,如果您想要人口差异,请改为list.size()
。
答案 1 :(得分:0)
问题在于:
double average = sum(list)/list.size();
sum(ArrayList<Integer>)
返回int
,sum(list)/list.size()
是整数除法,因此您将获得int
结果。除法的小数部分将被截断。
为了解决这个问题,你应该将该部门的一个操作数强制转换为double
:
double average = ((double)sum(list))/list.size();
类似于variance
方法。
这与主要问题无关,但您应该code oriented to interfaces, not to direct class implementations。这意味着,将变量和参数声明为List<Integer>
而不是ArrayList<Integer>
。这是一个例子:
public static int sum(List<Integer> list) {
int sum = 0;
for(int i=0; i<list.size(); i++ ){
sum = sum + list.get(i) ;
}
return sum;
}
//...
List<Integer> list = new ArrayList<Integer>();