java—将一维数组复制到二维数组

1dkrff03  于 2021-07-08  发布在  Java
关注(0)|答案(4)|浏览(767)

所以我的作业要求我:
编写一个接受两个参数的方法:整数数组和表示元素数的整数。它应该返回一个二维数组,该数组将传递的一维数组划分为包含所需元素数的行。请注意,如果数组的长度不能被所需的元素数整除,则最后一行的元素数可能较少。例如,如果数组 {1,2,3,4,5,6,7,8,9} 号码呢 4 如果传递给此方法,则应返回二维数组 {{1,2,3,4},{5,6,7,8},{9}} .
我试着用以下代码来解决这个问题:

public static int[][] convert1DTo2D(int[] a, int n) {
    int columns = n;
    int rows = a.length / columns;
    double s = (double) a.length / (double) columns;
    if (s % 2 != 0) {
        rows += 1;
    }
    int[][] b = new int[rows][columns];
    int count = 0;

    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
            if (count == a.length) break;
            b[i][j] = a[count];
            count++;
        }
    }
    return b;
}

但我遇到了一个问题,当我尝试打印新数组时,这是输出:

[[1, 2, 3, 4], [5, 6, 7, 8], [9, 0, 0, 0]]

那我怎么才能去掉最后的3个零呢?只是一个注意,我不能使用任何方法从 java.util.* 或者任何内置的方法。

4zcjmb1e

4zcjmb1e1#

将二维数组的初始化更改为不包含第二个维度: new int[rows][] . 您的数组中现在有空数组。必须初始化循环中的那些: b[i]=new int[Math.min(columns,remainingCount)]; 其中remainingcount是2d数组外的数字量。

kqlmhetl

kqlmhetl2#

用一维数组中的值填充二维数组(只要存在):

public static int[][] convert1DTo2D(int[] arr, int n) {
    // row count
    int m = arr.length / n + (arr.length % n == 0 ? 0 : 1);
    // last row length
    int lastRow = arr.length % n == 0 ? n : arr.length % n;
    return IntStream.range(0, m)
            .mapToObj(i -> IntStream.range(0, i < m - 1 ? n : lastRow)
                    .map(j -> arr[j + i * n])
                    .toArray())
            .toArray(int[][]::new);
}
public static void main(String[] args) {
    int[] arr1 = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int[][] arr2 = convert1DTo2D(arr1, 4);

    System.out.println(Arrays.deepToString(arr2));
    // [[1, 2, 3, 4], [5, 6, 7, 8], [9]]
}

另请参见:如何使用一维数组中的值填充二维数组?

tvokkenx

tvokkenx3#

在代码中添加此if条件将缩短最终数组(如果大小不正确):

...
final int[][] b = new int[rows][columns];

if ((a.length % columns) != 0) {
    b[rows - 1] = new int[a.length % columns];
}

int count = 0;
...
``` `%` 是模运算符,它给出第一个数和第二个数除法的余数。 `9 % 4` 将返回1,即最终数组所需的确切大小。
然后,我们只需将最后一个数组替换为该大小的新数组。
8oomwypt

8oomwypt4#

最好在方法中切换参数:

int[][] convert1DTo2D(int cols, int... arr)

允许使用vararg。
此外,还可以迭代输入数组(单循环)而不是嵌套循环。
实施示例:

public static int[][] convert1DTo2D(int cols, int... a) {
    int lastRowCols = a.length % cols;
    int rows = a.length / cols;

    if (lastRowCols == 0) {
        lastRowCols = cols;
    } else {
        rows++;
    }

    int[][] b = new int[rows][];

    for (int i = 0; i < a.length; i++) {
        int r = i / cols;
        int c = i % cols;
        if (c == 0) { // start of the row
            b[r] = new int[r == rows - 1 ? lastRowCols : cols];
        }
        b[r][c] = a[i];
    }
    return b;
}

相关问题