【问题标题】:How to transform an array to the table in Java?如何将数组转换为 Java 中的表?
【发布时间】:2015-06-13 22:50:49
【问题描述】:

假设,我有一个类似的数组

[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]]

等等

【问题讨论】:

  • 如果N=5 在您的示例中,我是否正确回答为[[1,2,3,4,5],[6,7,8,9,10],[11,12]]
  • 我不认为这是有足够的通用用途的图书馆,但它应该很简单吗?
  • @DoubleDouble 在我的情况下它始终是一个表,但如果不是,可能为原始填充 0 并为对象填充 null:[[1,2,3,4,5],[ 6,7,8,9,10],[11,12,0,0,0]]

标签: java arrays collections


【解决方案1】:

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

我回答了一个类似的问题,你可以找到逻辑there,但这里稍作修改以将数组作为参数:

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 :-)
【解决方案2】:

只使用 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++;
            }
        }
    }

输出应该是你所要求的。

【讨论】:

    【解决方案3】:

    并非如此,但您可以使用一些数学和循环轻松创建一个:

    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;
    }
    

    【讨论】:

      【解决方案4】:

      我们可以这样做:

      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-23
        • 2018-09-24
        • 2017-04-09
        • 2020-05-29
        • 2011-11-27
        • 2011-02-06
        • 1970-01-01
        相关资源
        最近更新 更多