我的循环有什么问题?
问题描述:
public class Prices {
public static void main(String[] args) {
int i = 100;
int z = 0;
int x = 0;
int a = 0;
int v = 0;
double sum = 0;
double[][] MovingAvgArray = new double[i][i];
double[] List = {20.19, 21.67, 22.49, 22.26,23.99, 23.75, 23.34, 23.54, 23.25, 23.9, 23.84, 23.19, 22.03, 22.7, 21.14, 22.54, 24.36, 24.85, 23.96, 25.1, 20.79, 19.96, 19.98, 19.54, 19.09, 18.47, 18.59, 18.96, 18.93, 18.79, 19.06, 19.82, 19.5, 19.13, 19.25, 18.9, 19.05, 19.02, 19.09, 18.73, 18.44, 18.65, 18.07, 18.12, 17.92, 18.21, 17.81, 18.57, 18.92, 18.4, 17.83, 17.83, 18.55, 18.25, 18.55, 17.72, 17.28, 17.37, 16.99, 16.28, 17.02, 15.68, 15.73, 16.45, 15.54, 15.15, 15.51, 15.51, 15.54, 15.05, 14.98, 15.88, 16.14, 16.2, 16, 16.82, 17.74, 18.01, 17.99, 18.01, 16.99, 18, 18.3, 19.02, 18.14, 18.95, 19.19, 18.67, 17.63, 17.6, 17.56, 18.59, 18.57, 19.07, 19.57, 19.59, 18.71, 18.71, 18.75, 19.37};
do{
do{
for(;v < a + x +2;)
{
sum = sum + List[v];
v++;
}
MovingAvgArray[x][z] = sum;
MovingAvgArray[x][z] = (MovingAvgArray[x][z])/(x + 2.0);
System.out.println(MovingAvgArray[x][z]);
z++;
a++;
sum = 0;
v--;
}while(z<100-(x+1));
v = 0;
z=0;
x++;
}while(x<i-2);
}
}
该程序的目标是获得数据列表的移动平均值(在for循环中计算),从前两个数字的移动平均值开始,然后是前三个数字等。并将其插入MovingAvgArray。两个数字的移动平均值将在数组值[0] [0到(i-3)]上,三个数字的平均值将在值[0] [0到(i-4)]等等上。直到这不再可能。我的循环有什么问题?
如果我拿出最外面的do-while循环,程序运行没有错误,但只计算两个数字的移动平均值(将会有98个)。
当我尝试循环它做三个数字,这是上述代码我得到的错误“线程中的异常”主要“java.lang.ArrayIndexOutOfBoundsException:100”在线说,“sum = sum + List [ v];
其中,我相当肯定意味着List [v]中的v是一个大于List [v]中列出的值的数字(它试图获得只有数组的第101个值100个值)。
问题是我不知道为什么会这样,因为“v”应重新设置为0,在此之前循环试图再次运行。
答
我有一个llowed自己额外的println的添加到代码中,像
v--;
System.out.println(" ------------------ v=" + v);
System.out.println(" ------------------ z=" + z);
System.out.println(" ------------------ x=" + x);
System.out.println(" ------------------ a=" + a);
} while (z < 100 - (x + 1));
System.out.println(" HERE ");
v = 0;
只是观察到:
19.060000000000002
------------------ v=99
------------------ z=99
------------------ x=0
------------------ a=99
HERE
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
at Prices.main(Prices.java:24)
这意味着环路由
而(Z控制< 100 - ( x + 1))
结束。 一个仍99,X增加1,使一个+ X + 2 = 102
我建议,如果不是调试,那么更多的变量中的至少印刷值。这将有希望使得它更快地清除正在缠绕的东西。例如,我不认为有人会计算List数组的大小,这很乏味。并用较小的方法分割代码。 – rtybase
你能解释一下你的'MovingAvgArray'会持有多少?也许使用一个小例子数据?在数组 “列表” 号码 –
列表= 1, 2, 3, 4, 5, MovingAvgArray将就的 (1 + 2)/ 2的第一列中的值, (2 + 3)/ 2, (3 + 4)/ 2, (4 + 5)/ 2, (5 + 6)/ 2 所述阵列的第二列将持有 - (1 + 2 3)/ 3 ,. (2 + 3 + 4)/ 3, (3 + 4 + 5)/ 3, (4 + 5 + 6)/ 3 第三列将保持 - (1 + 2 + 3 + 4)/ 4, (2 + 3 + 4 + 5)/ 4, (3 + 4 + 5 + 6)/ 4 – Origomar