用ArrayList Java计算样本方差

用ArrayList Java计算样本方差,java,Java,我正在做一个练习,你必须使用java中的ArrayList计算方差 我原以为对数组列表使用双精度而不是整数的单独计算方法会有所帮助,但事实并非如此 import java.util.ArrayList; public class Variance { // Copy here sum from exercise 63 public static double sum(ArrayList<Integer> list) { int i = 0;

我正在做一个练习,你必须使用java中的ArrayList计算方差

我原以为对数组列表使用双精度而不是整数的单独计算方法会有所帮助,但事实并非如此

import java.util.ArrayList;

public class Variance {
    // Copy here sum from exercise 63 
    public static double sum(ArrayList<Integer> list) {
        int i = 0;
        int sum = 0;

        while (i < list.size()) {
            sum += list.get(i);
            i++;
        }

        return sum;
    }

    public static double sumdouble(ArrayList<Double> list) {
        int i = 0;
        double sum = 0;

        while (i < list.size()) {
            sum += list.get(i);
            i++;
        }

        return sum;
    }

    // Copy here average from exercise 64 
      public static double average(ArrayList<Integer> list) {
        double sum = sum(list);
        double average = sum / list.size();
        return average;
    }

         public static double averagedouble(ArrayList<Double> lists) {
        double sum = sumdouble(lists);
        double average = sum / lists.size();
        return average;
    }

    public static double variance(ArrayList<Integer> list) {


        double mean = average(list);
        int i = list.size() - 1;
        ArrayList<Double> varianceList = new ArrayList<Double>();


        while (i >= 0) {
            //gets value

            double value = list.get(i);
            value = value - mean;
            value = value * value;
            varianceList.add(value);


        }

        double final = averagedouble(varianceList);

        return final;
    }

    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));
    }

}
import java.util.ArrayList;
公共类方差{
//把练习63中的总和抄到这里
公共静态双和(ArrayList列表){
int i=0;
整数和=0;
而(i=0){
//获得价值
double value=list.get(i);
值=值-平均值;
值=值*值;
变量列表。添加(值);
}
最终双精度=平均双精度(方差列表);
返回最终结果;
}
公共静态void main(字符串[]args){
ArrayList=新建ArrayList();
增加(3);
增加(2);
增加(7);
增加(2);
System.out.println(“差异为:“+差异(列表));
}
}
netbeans中的错误:不兼容的类型:无法创建ArrayList 转换成双倍


谢谢您的帮助。

您的问题都在方差法中。 您需要循环中的减量
--i
您必须将返回变量重命名为其他变量,或者直接返回值。您的方法应该是:

public static double variance(ArrayList<Integer> list) {

    double mean = average(list);
    int i = list.size() - 1;
    ArrayList<Double> varianceList = new ArrayList<Double>();


    while (i >= 0) {
        //gets value

        double value = list.get(i);
        value = value - mean;
        value = value * value;
        varianceList.add(value);
        --i;

    }

    return averagedouble(varianceList);
}
公共静态双方差(ArrayList列表){
双平均值=平均值(列表);
int i=list.size()-1;
ArrayList varianceList=新的ArrayList();
而(i>=0){
//获得价值
double value=list.get(i);
值=值-平均值;
值=值*值;
变量列表。添加(值);
--一,;
}
返回averagedouble(方差列表);
}

我也会考虑将大部分while循环转换为循环,因为它们更适合于循环整个数组。

您错过了减少循环,<代码> -i;代码中缺少代码>

使用此代码,它是优化和干净的:

import java.util.ArrayList;
public class Variance 
{
    ArrayList<Integer> listOfIntegers;
    int size;
    public Variance(ArrayList<Integer> listOfIntegers) 
    {
        this.listOfIntegers = listOfIntegers;
        size = listOfIntegers.size();
    }   

    double getMean()
    {
        double sum = 0.0;
        for(double a : listOfIntegers)
           sum += a;
        return sum/size;
    }

    double getVariance()
    {
        double mean = getMean();
        double square = 0;
        for(double a :listOfIntegers)
            square += (a-mean)*(a-mean);
        return square/size;
    }
}
import java.util.ArrayList;
公共类方差
{
数组列表;
整数大小;
公共方差(ArrayList积分列表)
{
this.listOfIntegers=listOfIntegers;
size=listOfIntegers.size();
}   
双getMean()
{
双和=0.0;
for(双a:整数列表)
总和+=a;
返回金额/大小;
}
double getVariance()
{
双平均值=getMean();
双平方=0;
for(双a:整数列表)
平方+=(a-平均值)*(a-平均值);
返回平方/大小;
}
}

方法中存在声明错误的数据类型:

public static double sum(ArrayList<Integer> list)
在这种方法中:

public static double average(ArrayList<Integer> list) {
        //double sum = sum(list);
        int sum = sum(list);
        double average = sum / list.size();
        return average;
}
并且at return语句变量不应该是java
final

相反,您可以重命名它或仅返回method的值:


returnaveragedouble(varianceList)

导入java.util.ArrayList

公共类方差{

public static int sum(ArrayList<Integer> list) {
    int sum=0;
    for(int i:list){
        sum+=i;
    }



    return sum;
}


public static double average(ArrayList<Integer> list) {
    double size = list.size();
    return(1.0*sum(list)/size);

}

public static double variance(ArrayList<Integer> list) {
    // write code here

    double asq=0.0;
    for(int i:list){
        asq = asq + Math.pow((i-average(list)),2);
    }
    double var = asq/(list.size()) ;
    return var;
}

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));
}
公共静态整数和(ArrayList列表){
整数和=0;
用于(int i:列表){
总和+=i;
}
回报金额;
}
公共静态双平均(ArrayList列表){
double size=list.size();
返回值(1.0*总和(列表)/大小);
}
公共静态双方差(ArrayList列表){
//在这里写代码
双asq=0.0;
用于(int i:列表){
asq=asq+数学功率((i-平均值(列表)),2);
}
double var=asq/(list.size());
收益var;
}
公共静态void main(字符串[]args){
ArrayList=新建ArrayList();
增加(3);
增加(2);
增加(7);
增加(2);
System.out.println(“差异为:“+差异(列表));
}

}

你的while循环永远不会结束,这个
double final=averagedouble(varianceList)
不会编译,因为
final
是一个Java关键字。虽然此代码可能会回答此问题,但提供有关此代码为什么和/或如何回答此问题的其他上下文将提高其长期价值。
while (i >= 0) {
    //gets value
double value = list.get(i);
       value = value - mean;
       value = value * value;
       varianceList.add(value);
       i--;  // decrease i index 
}
public static int sum(ArrayList<Integer> list) {
    int sum=0;
    for(int i:list){
        sum+=i;
    }



    return sum;
}


public static double average(ArrayList<Integer> list) {
    double size = list.size();
    return(1.0*sum(list)/size);

}

public static double variance(ArrayList<Integer> list) {
    // write code here

    double asq=0.0;
    for(int i:list){
        asq = asq + Math.pow((i-average(list)),2);
    }
    double var = asq/(list.size()) ;
    return var;
}

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));
}