java—将每个列的所有元素添加到一个2d数组中

zzoitvuj  于 2021-07-06  发布在  Java
关注(0)|答案(5)|浏览(431)

所以我有一个虚拟的二维数组:

int mat[][] = {
        {10, 20, 30, 40, 50, 60, 70, 80, 90},
        {15, 25, 35, 45},
        {27, 29, 37, 48},
        {32, 33, 39, 50, 51, 89}};

我想把所有的值按列累加起来,这样就可以加上10+15+27+32,然后返回84,依此类推。到目前为止我有:

public void sum(int[][] array) {
    int count = 0;
    for (int rows = 0; rows < array.length; rows++) {
        for (int columns = 0; columns < array[rows].length; columns++) {
            System.out.print(array[rows][columns] + "\t");
            count += array[0][0];
        }
        System.out.println();
        System.out.println("total = " + count);
    }
}

有人能帮忙吗?还有 System.out.print(array[rows][columns] + "\t" ); 按行打印数组,有没有按列打印的方法?

wb1gzix0

wb1gzix01#

你可以用 Stream.reduce 按列汇总矩阵行元素的方法:

int[][] matrix = {
        {10, 20, 30, 40, 50, 60, 70, 80, 90},
        {15, 25, 35, 45},
        {27, 29, 37, 48},
        {32, 33, 39, 50, 51, 89}};

int[] arr = Arrays.stream(matrix)
        // summarize in pairs
        // the rows of the matrix
        .reduce((row1, row2) -> IntStream
                // iterate over the indices
                // from 0 to maximum row length
                .range(0, Math.max(row1.length, row2.length))
                // summarize in pairs the elements of two rows
                .map(i -> (i < row1.length ? row1[i] : 0) +
                        (i < row2.length ? row2[i] : 0))
                // an array of sums
                .toArray())
        // the resulting array
        .get();

System.out.println(Arrays.toString(arr));
// [84, 107, 141, 183, 101, 149, 70, 80, 90]

另请参见:
•2个不同2d阵列的总和
•如何计算2d数组中每列的平均值?

1tu0hz3e

1tu0hz3e2#

使用arraylist获取所有列的总和。

public static void sum(int[][] array) {
    ArrayList<Integer> sums = new ArrayList<>();
    for (int row = 0; row < array.length; row++) {
        for (int column = 0; column < array[row].length; column++) {
            if (sums.size() <= column) {
                sums.add(column, 0);
            }
            int curVal = sums.get(column);
            sums.remove(column);
            sums.add(column, curVal + array[row][column]);
        }
    }
    for (int i = 0; i < sums.size(); i++) {
        System.out.println("Sum of column " + i + " = " + sums.get(i));
    }
}
a14dhokn

a14dhokn3#

……兰姆达也是这样:

int[] array = Stream.of(mat).reduce((a1, a2) -> {
    int i = 0;
    int[] rslt = a1.length > a2.length ? a1 : a2;
    for (int n : a1.length > a2.length ? a2 : a1)
        rslt[i++] += n;
    return (rslt);
}).get();

获取 int[] array :

[84, 107, 141, 183, 101, 149, 70, 80, 90]
nbnkbykc

nbnkbykc4#

一种可能的解决方案是,首先找到所有子数组的最大大小,然后多次迭代以找到每列的总和,从而避免不可用的值。

public static void main(String[] args) {
    int mat[][] = {{10, 20, 30, 40, 50, 60, 70, 80, 90},
            {15, 25, 35, 45},
            {27, 29, 37, 48},
            {32, 33, 39, 50, 51, 89},
    };

    // Find maximum possible length of sub array
    int maxLength = 0;
    for (int i = 0; i < mat.length; i++) {
        if (maxLength < mat[i].length)
            maxLength = mat[i].length;
    }

    for (int i = 0; i < maxLength; i++) {
        int sum = 0;
        for (int j = 0; j < mat.length; j++) {
            // Avoid if no value available for
            // ith column from this subarray
            if (i < mat[j].length)
                sum += mat[j][i];
        }
        System.out.println("Sum of Column " + i + " = " + sum);
    }
}
2mbi3lxu

2mbi3lxu5#

这里有一个选择。
提供的数据。

int mat[][] = { { 10, 20, 30, 40, 50, 60, 70, 80, 90 },
        { 15, 25, 35, 45 }, { 27, 29, 37, 48 },
        { 32, 33, 39, 50, 51, 89 }, };

首先,找到存储和的数组的最大长度。

int max = Arrays.stream(mat).mapToInt(a -> a.length).max().orElse(0);

分配新数组来保存和。

int[] sums = new int[max];

现在就用 Arrays.setAll 方法求和,小心
不超过当前数组的长度。

for (int[] arr : mat) {
    Arrays.setAll(sums, i-> i < arr.length ? sums[i] + arr[i] : sums[i]);
}

System.out.println(Arrays.toString(sums));

印刷品

[84, 107, 141, 183, 101, 149, 70, 80, 90]

相关问题