将数组操作到新数组中

时间:2014-04-03 23:13:25

标签: java arrays variables methods

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

{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在语法上是不正确的,但我无法找到另一种方法来实现相同的想法。

3 个答案:

答案 0 :(得分:2)

问题#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增加两个索引。

答案 1 :(得分: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 :(得分:0)

也许您的意思是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 < oldArray.length - oldArray.length % 2确保对于奇数数组,忽略最后一个元素。