简体   繁体   English

调整原始2D数组的大小

[英]Resize primitive 2D array

Given the following two-dimensional (2D) array of integers, how can I resize the array similar to Numpy's resize() function for Python? 给定下面的二维(2D)整数数组,如何调整数组的大小,类似于Numpy的 Python resize()函数

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

Code

public class MatrixUtils {
    public static void main(String[] args) {
        int[][] matrix = new int[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };

        System.out.println(formatMatrix(matrix));
        System.out.println(formatMatrix(resize(matrix, 4, 4)));
        System.out.println(formatMatrix(resize(matrix, 2, 2)));
    }

    public static int[][] resize(int[][] matrix, int w, int h) {
        return addRows(addCols(matrix, w-getWidth(matrix)), h-getHeight(matrix));
    }
}

With System.arraycopy() , you can modify the length of an Array by reserving a new place in memory and changing the pointer. 使用System.arraycopy() ,您可以通过在内存中保留新位置并更改指针来修改数组的长度。

System.arraycopy(matrix, 0, copy, 0, n > 0 ? oldHeight : newHeight);

Expected Output 预期产出

1,2,3
4,5,6
7,8,9

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

1,2
4,5

Using the following code below, you can alter the dimensions of the array. 使用下面的代码,您可以更改数组的尺寸。 There are also several formatting functions to configure the separator tokens. 还有几个格式化函数来配置分隔符标记。

public class MatrixUtils {
       public static void main(String[] args) {
              int[][] matrix = null;

              matrix = new int[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };

              System.out.println(formatMatrix(matrix, "=", "-") + '\n');
              System.out.println(formatMatrix(matrix) + '\n');
              System.out.println(formatMatrix(resize(matrix, 4, 4)) + '\n');
              System.out.println(formatMatrix(resize(matrix, 2, 2)) + '\n');
              System.out.println(formatMatrix(resize(matrix, 10, 15)) + '\n');
       }

       public static final int getWidth(final int[][] matrix) {
              int max = 0;
              if (matrix.length > 0) {
                     max = matrix[0].length;
                     if (matrix.length > 1) {
                           for (int i = 1; i < matrix.length; i++) {
                                  if (matrix[i].length > max) {
                                         max = matrix[i].length;
                                  }
                           }
                     }
              }
              return max;
       }

       public static final int getHeight(final int[][] matrix) {
              return matrix.length;
       }

       public static int[][] resize(final int[][] matrix, final int w, final int h) {
              int width = getWidth(matrix);
              int height = getHeight(matrix);
              return addRows(addCols(matrix, w - width), h - height);
       }

       private static int[][] addRows(final int[][] matrix, final int n) {
              if (n == 0) {
                     return matrix;
              }
              int oldHeight = matrix.length;
              int newHeight = oldHeight + n;
              int width = getWidth(matrix);
              int[][] copy = new int[newHeight][];
              System.arraycopy(matrix, 0, copy, 0, n > 0 ? oldHeight : newHeight);
              for (int i = oldHeight; i < newHeight; i++) {
                     copy[i] = new int[width];
              }
              return copy;
       }

       private static int[][] addCols(final int[][] matrix, final int n) {
              if (n == 0) {
                     return matrix;
              }
              int oldWidth = getWidth(matrix);
              int newWidth = oldWidth + n;
              int height = matrix.length;
              int[][] copy = new int[height][newWidth];
              for (int i = 0; i < height; i++) {
                     copy[i] = new int[newWidth];
                     System.arraycopy(matrix[i], 0, copy[i], 0, n > 0 ? oldWidth
                                  : newWidth);
              }
              return copy;
       }

       public static String formatMatrix(final int[][] matrix) {
              return formatMatrix(matrix, "\n", ",").toString();
       }


       public static String formatMatrix(final int[][] matrix, String vSep, String hSep) {
              return join(new StringBuffer(), matrix, vSep, hSep).toString();
       }

       public static StringBuffer join(final int[][] arr, String vSep, String hSep) {
              return join(new StringBuffer(), arr, vSep, hSep);
       }

       public static StringBuffer join(final int[] arr, String sep) {
              return join(new StringBuffer(), arr, sep);
       }

       protected static StringBuffer join(StringBuffer buff, final int[][] arr, String vSep, String hSep) {
              if (arr.length > 0) {
                     join(buff, arr[0], hSep);
                     for (int i = 1; i < arr.length; i++) {
                           join(buff.append(vSep), arr[i], hSep);
                     }
              }
              return buff;
       }

       protected static StringBuffer join(StringBuffer buff, int[] arr, String sep) {
              if (arr.length > 0) {
                     buff.append(arr[0]);
                     for (int i = 1; i < arr.length; i++) {
                           buff.append(sep).append(arr[i]);
                     }
              }
              return buff;
       }
}

Output 产量

1-2-3=4-5-6=7-8-9

1,2,3
4,5,6
7,8,9

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

1,2
4,5

1,2,3,0,0,0,0,0,0,0
4,5,6,0,0,0,0,0,0,0
7,8,9,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
static int[][] resize(int[][] matrix, int w, int h) {
    int[][] temp = new int[h][w];
    h = Math.min(h, matrix.length);
    w = Math.min(w, matrix[0].length);
    for (int i = 0; i < h; i++)
        System.arraycopy(matrix[i], 0, temp[i], 0, w);
    return temp;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM