打印从函数返回的总和数组不会打印总和

时间:2019-03-22 17:13:56

标签: java arrays

任务是返回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

3 个答案:

答案 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。控制台将产生与上述相同的结果。