2014-02-17 150 views
1

我在使用subAverage类时遇到了困难。使用主要方法时,它似乎不能正常工作。基本上,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); 
     } 
    } 
} 

回答

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

考虑这条线:

return sum/(end - start + 1); 

当你要求你的列表下半年,你是在6,3发送分别为endstartsubAverage方法。因此,您将总和除以4,但您只添加了3个值。要采取正确的平均水平,你需要做的:

return sum/(end - start); 

此外,还有从3至6包容迭代6个元素的数组的一个问题。这个数组的索引从0到5,所以执行这个迭代应该抛出一个ArrayIndexOutOfBoundsException异常。所以,我不确定你是如何得到这些结果的。

2

问题是趴在这一行

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

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

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

2

问题在于访问数组的索引..在第二个如果尝试此secondHalf

int secondHalf = june.subAverage(values.length/2, values.length - 1); 
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); 

类似。
因为有一个额外的索引被添加到分母中,您正在计算平均值(end + start + 1)

1

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

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