任务是返回1D数组中2D数组每一行的总和。
int[][] values = {
{1, 2, 3, 4, 5}, {2, 3, 4, 5, 1},
{3, 4, 5, 1, 2}, {4, 5, 1, 2, 3},
{5, 1, 2, 3, 4}
};
我要打印:
Row sums: 15 15 15 15 15
public int[]allRowSums()
{
int rowSum = 0;
int current = 0;
int[]a = null;
for(int i = 0; i < values.length; i++)
{
a = new int[values[i].length];
for(int j = 0; j < values[current].length; j++)
{
rowSum = values[current][j];
a[i] += rowSum;
}
rowSum = 0;
current++;
}
return a;
}
当我调用此方法时,我得到:
Row sums: [I@15db9742
答案 0 :(得分:1)
您正在将引用返回到数组,而不是总和。同样,在每次迭代中,您都在创建一个新的数组,因此,先前的值将丢失。
简单地将初始化移出循环:
public static int[] allRowSums() {
int rowSum = 0;
int current = 0;
int[] a = new int[values.length]; // observe this change (only 1 change made)
for (int i = 0; i < values.length; i++) {
for (int j = 0; j < values[current].length; j++) {
rowSum = values[current][j];
a[i] += rowSum;
}
rowSum = 0;
current++;
}
return a;
}
并且如注释中所述,您正在打印数组的引用,使用Arrays.toString()
打印出数组。
System.out.println(Arrays.toString(allRowSums()));
答案 1 :(得分:0)
要迭代求和结果,您应该使用循环来迭代数组的所有元素。
尝试类似的方法
for(int intVar : a)
System.out.println(intVar);
答案 2 :(得分:0)
代码修复
如果正确打印,当前的实现将以某种方式返回0, 0, 0, 0, 15
,首先将数组转换为String:
System.out.println(Arrays.toString(array));
之所以会这样,是因为您总是刷新第一个(外部)for循环中的所有值。执行以下操作
int rowSum = 0;
int current = 0;
int[] a = new int[values.length]; // proper initialization to avoid NPE
for (int i=0; i<values.length; i++) {
// this line removed
for (int j=0; j<values[current].length; j++) {
rowSum = values[current][j];
a[i] += rowSum;
}
rowSum = 0;
current++;
}
return a;
现在该代码可以正常工作,并且在示例中将包含15, 15, 15, 15, 15
。
更好的解决方案
Stream API适用于此用例。收集器Get a list of dates between two dates using a function和映射的适当组合可以达到目的
int[] array = Arrays.stream(values)
.map(i -> Arrays.stream(i)
.boxed()
.collect(Collectors.summingInt(j -> j)))
.mapToInt(i -> i)
.toArray();
将此array
打印到ex。控制台将产生与上述相同的结果。