我尝试遍历并执行计算的两个大小不同的数组,但最终输出不正确。
这是数组:
int[] array1 = [5, 10, 2]
int[] array2 = [11, 23, 4, 6, 5, 8, 9]
int[] array1 = {5, 10, 2};
int[] array2 = {11, 23, 4, 6, 5, 8, 9};
ArrayList<Integer> calculationsArray = new ArrayList<Integer>();
int calculations = 0;
for(int i = 0; i < array1.length; i++) {
for(int j = 0; j < array2.length; j++) {
calculations = ((array1[i] + array2[j]) % 10);
}
calculationsArray.add(calculations);
}
我希望输出[6, 3, 6, 1, 0, 8, 1]
。 4个循环的示例计算为:
- (11 + 5)%10 = 6
- (23 + 10)%10 = 3
- (4 + 2)%10 = 6
- (6 + 5)%10 = 1
但是实际输出是:[4,9,1]
答案 0 :(得分:2)
让我们首先谈谈为什么您看到自己看到的东西。
我已经在此处重新发布了您的代码,更改了缩进以反映嵌套:
for(int i = 0; i < array1.length; i++) {
for(int j = 0; j < array2.length; j++) { // <--- This loop
calculations = ((array1[i] + array2[j]) % 10);
}
calculationsArray.add(calculations);
}
让我们看一下内部循环,即上面我标记的循环。请注意,在循环的每次迭代中,都将calculations
设置为新值。这将覆盖先前计算的值,以便当内部循环完成运行时,calculations
的值将等于该循环中最后计算的值。这就是您实际看到的内容,因为
i = 0
时,内循环的最后一次计算为(array1[0] + array2[6]) % 10
,即(5 + 9) % 10
= 4,i = 1
时,内循环的最后一次计算为(array1[1] + array2[6]) % 10
,即(10 + 9) % 10
= 9,i = 2
时,内部循环的最后一次计算为(array1[2] + array2[6]) % 10
= 1。嘿,看!您正在看到自己的(2 + 9) % 10
。
下一个问题是如何解决此问题。我认为您遇到的主要问题是双重嵌套循环可能不是解决问题的方法。具体来说,这里的double for循环将运行[4, 9, 1]
×{array1.length
次,比您需要运行它的次数还要多。
第一个问题-循环应运行多少次?好吧,您希望输出数组具有两个输入数组中较长者的长度,是array2.length
倍。您能否制作一个最多等于该数字的循环?
然后,您需要处理以下事实:循环可能需要循环遍历每个输入数组多次。在您给出的示例中,您将多次读取Math.max(array1.length, array2.length)
的值,因为array1
更长,但是您也很容易不得不读取多个array2
的值array2
更长的时间。
有关如何执行此操作的提示,请查看当索引太大时是否可以使用mod运算符array1
进行环绕。
希望这会有所帮助!
答案 1 :(得分:0)
怎么样(未优化)呢?
ArrayList<Integer> calculationsArray = new ArrayList<Integer>();
int calculations = 0;
int j = 0;
while (j < array2.size()) {
for (int i = 0; i < array1.size(); i++) {
calculations = ((array1.get(i) + array2.get(j)) % 10);
calculationsArray.add(calculations);
}
j++;
}