数组 - 平均

时间:2014-02-17 15:02:27

标签: java arrays

我在使用subAverage类时遇到困难。当我使用main方法时,它似乎无法正常运行。基本上subAverage对包含开始和结束索引的数组中的项进行平均。但是,当我运行这个时,我得到了

3
6
3

什么时候得到

3
9
6

我做错了什么?

public class Weight {

    int[] data;

    Weight(int[] init) {

        data = new int[init.length + 1];

        for (int j = 0; j < init.length; j++) {
            data[j] = init[j];
        }
    }

    int subAverage(int start, int end) {
        int sum = 0;
        for (int j = start; j <= end; j++) {
            sum = data[j] + sum;
        }
        return sum / (end - start + 1);
    }

    public static void main(String[] args) {
        int[] values = {1, 3, 5, 7, 9, 11};
        Weight june = new Weight(values);

        if (values.length % 2 == 0) {
            int firstHalf = june.subAverage(0, values.length / 2 - 1);
            int secondHalf = june.subAverage(values.length / 2, values.length);
            int difference = Math.abs(secondHalf - firstHalf);
            System.out.println(firstHalf);
            System.out.println(secondHalf);
            System.out.println(difference);
        }

        if (values.length % 2 == 1) {
            int firstHalf = june.subAverage(0, values.length / 2);
            int secondHalf = june.subAverage(values.length / 2, values.length);
            int difference = Math.abs(secondHalf - firstHalf);
            System.out.println(firstHalf);
            System.out.println(secondHalf);
            System.out.println(difference);
        }
    }
}

6 个答案:

答案 0 :(得分:4)

问题在于数据初始化代码[]

data = new int[init.length + 1];

应该是

data = new int[init.length];

然后问题是subAverage循环条件

for (int j = start; j <= end; j++) {

应该是

for (int j = start; j < end; j++) {

调用代码的另一个问题

int secondHalf = june.subAverage(values.length / 2, values.length);

应该是

int secondHalf = june.subAverage(values.length / 2, values.length - 1);

希望这有帮助。

答案 1 :(得分:2)

问题在于这一行

int secondHalf = june.subAverage(values.length / 2, values.length);

您可以像下面这样解决此问题。

int secondHalf = june.subAverage(values.length / 2, values.length - 1);

答案 2 :(得分:2)

问题在于访问数组的索引..请尝试使用secondHalf

int secondHalf = june.subAverage(values.length / 2, values.length - 1);

答案 3 :(得分:2)

更改

if (values.length % 2 == 0) {
        int firstHalf = june.subAverage(0, values.length / 2 - 1);
        int secondHalf = june.subAverage(values.length / 2, values.length);

if (values.length % 2 == 0) {
        int firstHalf = june.subAverage(0, values.length / 2 - 1);
        int secondHalf = june.subAverage(values.length / 2, values.length-1);

类似于第二个if。
因为在计算平均值(结束+开始+ 1)时,分母中添加了一个附加索引。

答案 4 :(得分:1)

考虑这一行:

return sum / (end - start + 1);

当您为列表的后半部分调用subAverage方法时,您分别为endstart发送6和3。因此,您将总和除以4,但您只添加了3个值。要获得正确的平均值,您需要执行以下操作:

return sum / (end - start);

此外,在6个元素的数组中,从3到6的迭代次数存在问题。此数组的索引从0到5,因此执行此迭代应抛出ArrayIndexOutOfBoundsException。所以,我不确定你是如何得到这些结果的。

答案 5 :(得分:1)

使用“int secondHalf = june.subAverage(values.length / 2,values.length - 1);”

这里的values.length将是6 ...而你的循环应该以5(0 - 5)结束...所以使用values.length-1。