我在使用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);
}
}
}
答案 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
方法时,您分别为end
和start
发送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。