【问题标题】:Manipulating an Array into a New Array将数组操作为新数组
【发布时间】:2014-05-16 01:15:27
【问题描述】:

我正在尝试编写一个方法,该方法采用一个数组,并将相邻的单元格添加在一起以生成一个新数组。用例子更容易解释:

{11, 4, 3, 18, 23, 9} --> {15, 21, 32}

{5, 5, 21, 13, 1} --> {10, 34}(第六个单元格被忽略)

public static int[] collapse(int[] a) {
    int[] b = new int[a.length / 2];
    for (int j = 0 ; j < (a.length - 1) ; j+2) {    //goes thru original array
        for (int i = 0 ; i < b.length ; i++) {      //populates new array
            b[i] = a[j] + a[j+1];
        }
    }
    return b;
}

我认为这需要使用嵌套的 for 循环,第一个循环通过原始数组,第二个循环填充新数组。我知道第一个 for 循环中的 j+2 在语法上不正确,但我想不出另一种方法来实现相同的想法。

【问题讨论】:

    标签: java arrays variables methods


    【解决方案1】:

    不要使用两个循环。只需在输出数组中保留一个代表您的位置的计数器(outputIndex),并在每次使用后递增:

    public static int[] collapse(int[] a) {
        int[] b = new int[a.length / 2];
        int outputIndex = 0;
        for (int j = 1 ; j < a.length ; j+=2) {    //goes thru original array
            b[outputIndex++] = a[j - 1] + a[j];
        }
        return b;
    }
    

    此外,我在 j = 1 处开始循环,以便它处理您缺少要添加的最后一项的情况。请记住,您要添加的两个项目位于 [j-1] 和 [j],而不是 [j] 和 [j+1]。

    【讨论】:

      【解决方案2】:

      也许您的意思是j=j+2,而不仅仅是j+2

      事实上,这可以通过一个for 循环来完成。

      for(int i = 0; i < oldArray.length - oldArray.length % 2; i+=2) {
          newArray[i/2] = oldArray[i] + oldArray[i+1]
      }
      

      i &lt; oldArray.length - oldArray.length % 2 确保对于奇数数组,忽略最后一个元素。

      【讨论】:

        【解决方案3】:

        问题 #1:for 中的第三个表达式通常需要修改索引。 j+2 本身并没有这样做; j = j + 2 会。 (或j += 2。)

        问题 #2:您不想要嵌套的 for 循环。它的作用是:首先将j 设置为0,然后让i 遍历整个b 数组。然后它增加j(在你解决了第一个问题之后)并让i再次遍历整个b数组。这不是你想要的;您希望它们并行增加。

        一种方法是将i 声明为循环外的变量:

        int i = 0;
        for (int j = 0; j < a.length - 1; j += 2) {
             b[i++] = a[j] + a[j + 1];
        }
        

        确保循环体递增i。或者,您可以花哨:

        for (int i = 0, j = 0; j < a.length - 1; i++, j += 2) {
            b[i] = a[j] + a[j + 1];
        }
        

        for 增加两个索引。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-17
          • 1970-01-01
          • 2019-10-26
          • 1970-01-01
          • 1970-01-01
          • 2013-03-09
          • 1970-01-01
          相关资源
          最近更新 更多