如何在两个大小不同的数组上执行计算?

时间:2019-06-26 15:43:33

标签: java arrays

我尝试遍历并执行计算的两个大小不同的数组,但最终输出不正确。

这是数组:

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个循环的示例计算为:

  
      
  1. (11 + 5)%10 = 6
  2.   
  3. (23 + 10)%10 = 3
  4.   
  5. (4 + 2)%10 = 6
  6.   
  7. (6 + 5)%10 = 1
  8.   

但是实际输出是:[4,9,1]

2 个答案:

答案 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++;
}