我正在尝试编写一个采用数组的方法,并将相邻的单元格添加到一起以生成一个新数组。用例子解释起来比较容易:
{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在语法上是不正确的,但我无法找到另一种方法来实现相同的想法。
答案 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
确保对于奇数数组,忽略最后一个元素。