为了计算正确的平均值,我需要更改什么功能?

时间:2020-09-26 11:52:10

标签: java arraylist bluej

我对Java还是很陌生,我正在尝试创建一个类Average,该对象的对象将计算可以通过以下方式添加到其中的整数的平均值(另一个类Integers的对象)。首先使用addNumber方法。

我可以看到正确的数字已添加到对象中,并且计数器也可以正常工作,但是我似乎无法弄清楚如何计算ArrayList的总和,这样我就可以通过将它们的总和除以我的计数器来计算这些数字的平均值。

对于此行,我不断收到错误消息,即Integer无法转换为int:

for (int i : variables)

这是有道理的,但到目前为止,我尝试将其转换为一种的方法似乎都无效。我实际上是从这里(https://coderanch.com/t/673671/java/correctly-Sum-contents-ArrayList-Integer)复制那一行代码,但对我来说似乎真的行不通。我是否需要导入import java.util.*;以外的任何内容?

public class Average
{
    // Ints given by the user
    private ArrayList<Integer> variables;
    private int count = 0;
    private int sum;
    
    // Resulting average
    private int average;
   

    /**
     * When creating object, takes numbers from class Integer
     */
    public Average()
    {
        variables = new ArrayList<Integer>();
    }
    /**
     * Add variables to calculate averages from
     */
    
    public void addNumber(Integer newNumber)
    {
        variables.add(newNumber);
        count ++;      
    }
    /**
     * Method to calculate the average of the given variables
     */
    
    public int calcAverage(ArrayList<Integer> variables)
    {
        for (int i : variables)
        {
            sum += i;
        }
        return sum;
        average = sum / count;
    }    
}

1 个答案:

答案 0 :(得分:0)

您在此处共享的代码存在一些问题。

首先,从API角度来看,如果类具有calcAverage数据成员,为什么ArrayList<Inetger>variables作为参数?这样的方法应该是static或不带参数并计算成员的平均值。

第二,从编码的角度来看,它在将值分配给平均值之前返回sum,使行average = sum / count无法访问代码,并导致编译错误。

第三,从数学角度来看,由于sumcountint,因此它们的除法将以integer division的形式执行,在大多数情况下,您会得到错误的结果

最后,Average类除了添加数字之外,没有任何访问方法来检索添加到其上的数字,也没有修改方法来修改此列表。考虑到此API,保存数字列表可能是多余的。相反,您可以只保留要添加的数字的sumcount,然后按需返回它们的平均值:

public class Average {
    private int count = 0;
    private int sum = 0;
    
    /**
     * Add variables to calculate averages from
     */
    public void addNumber(int newNumber) {
        sum += newNumber;
        count++;
    }

    /**
     * Method to calculate the average of the given variables
     */
    public double calcAverage() {
        return ((double) sum) / count;
    }    
}