如何在Java中将数组转换为表格?

4
假设我有一个数组,如下所示:
[1,2,3,4,5,6,7,8,9,10,11,12]

有没有标准方法将其转换为具有 N 列的表格?

例如,如果 N=3

[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]

或者如果N=4
[[1,2,3,4],[5,6,7,8],[9,10,11,12]]

etc.


如果在你的例子中 N=5,那么我的回答是正确的,即 [[1,2,3,4,5],[6,7,8,9,10],[11,12]] - DoubleDouble
我认为这并不是足够通用以至于需要库,但它应该很容易实现吧? - Giovanni Botta
@DoubleDouble 在我的情况下它总是一个表格,但如果不是的话,可能会为原始类型填充0,为对象填充null以使其完整:[[1,2,3,4,5],[6,7,8,9,10],[11,12,0,0,0]] - Alexei Vinogradov
4个回答

2

在Java 8中,您可以使用IntStream来生成相应的索引,然后将其提供给Arrays.copyOfRange

我回答了一种类似的问题,您可以在这里找到逻辑,但这里稍微修改一下以将数组作为参数:

static List<int[]> partitionIntoList(int[] arr, int pageSize) {
    return IntStream.range(0, (arr.length + pageSize - 1) / pageSize)
        .mapToObj(i -> Arrays.copyOfRange(arr, i * pageSize, min(pageSize * (i + 1), arr.length)))
        .collect(toList());
}

static int[][] partitionIntoArray(int[] arr, int pageSize) {
    return IntStream.range(0, (arr.length + pageSize - 1) / pageSize)
        .mapToObj(i -> Arrays.copyOfRange(arr, i * pageSize, min(pageSize * (i + 1), arr.length)))
        .toArray(int[][]::new);
}

请注意,如果pageSize不能完美地划分输入的大小,则剩余的元素将添加到最后一个int数组中。
例如:
partitionIntoArray(new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, 4);

输出:

[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]

如果您将页面大小设为5,则最后两个元素将添加到第三个数组中:

[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12]]

希望能对您有所帮助!:)

我不知道我是否喜欢Java8 :-) - marcolopes

1
我们可以这样做:

int n = 5;  // what ever size you want to break it with
int[] bytes = {1,2,3,4,5,6,7,8,9,10,11,12};
int length = bytes.length;
int counter = 0;
int newSize = length % n == 0 ? length/n : (length/n)+1;
int[][] newArray = new int[newSize][n];
for (int i = 0; i < length - n + 1; i += n)
    newArray[counter++] = Arrays.copyOfRange(bytes, i, i + n);

if (length % n != 0)
    newArray[counter] = Arrays.copyOfRange(bytes, length - length % n, length);

1

仅使用 for 循环:

    int[] array = {1,2,3,4,5,6,7,8,9,10,11,12};
    int n = 3;
    int m = (int) Math.ceil( ( (double) array.length ) / n );
    int[][] table = new int[m][n];
    int k = 0;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (k < array.length) {
                table[i][j] = array[k];
                k++;
            }
        }
    }

输出应该是您所要求的内容。

1
并不需要,但是你可以使用一些数学和循环轻松创建一个:
public int[][] getTable(int[] arr, int n) {
    int[][] table = new int[(int)Math.ceil(arr.length / (float)n)][n];
    for (int i = 0, row = 0, column = 0; i < arr.length; i++) {
        if (i % n == 0 && i != 0) {
            row++;
            column = 0;
        }
        table[row][column++] = arr[i];
    }
    return table;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接