繁体   English   中英

将Java 2D数组(4x4)拆分为较小的数组(2x2),然后再次加入

[英]Splitting a Java 2D array (4x4) into smaller ones (2x2) and joining them again

此源代码将4x4数组拆分为2x2数组...如何将2x2数组的值恢复为4x4数组?

public class testmatriks {
    private static Random generator = new Random();

    public static void main(String[] args) {
        double[][] mainArray = new double[4][4];
        double[][] subArray = new double[2][2];
        double[][] rubArray = new double[4][4];
        int value;
        for (int i = 0; i < mainArray.length; i++) {
            for (int j = 0; j < mainArray[0].length; j++) {
                value = generator.nextInt(255);
                mainArray[i][j] = value;
                System.out.print(mainArray[i][j] + "  ");
            }
            System.out.println("");
        }
        System.out.println("\n");
        System.out.println("pecah ke piksel 2x2 piksel");

        for (int row = 0; row < (mainArray.length); row += 2) {
            for (int column = 0; column < mainArray[0].length; column += 2) {
                for (int k = 0; k < 2; k++) {
                    for (int l = 0; l < 2; l++) {
                        subArray[k][l] = mainArray[row + k][column + l] * 2;
                        System.out.print(subArray[k][l] + " ");
                    }
                    System.out.println(" ");
                }
            }
        }
    }
}

这张照片说明了我想要的

这张照片说明了我想要的。

这是您最初在4x4阵列中所拥有的:

[a 1 | b 1 | c 1 | d 1 ]
[a 2 | b 2 | c 2 | d 2 ]
[a 3 | b 3 | c 3 | d 3 ]
[a 4 | b 4 | c 4 | d 4 ]

这就是您创建的2x2数组中的内容:

[2 * c 3 | 2 * d 3 ]
[2 * c 4 | 2 * d 4 ]

当您说“恢复”时,不清楚将值放置在此4x4数组中的位置,因此我将只使用用于创建2x2的4x4中的位置:

编码:

for (int r = 0; r < 2; r++) {
    for (int c = 0; c < 2; c++) {
        mainArray[r + 2][c + 2] = subArray[r][c];
    }
}

这应该是代码运行后的内容:

[a 1 | b 1 | c 1 | d 1 ]
[a 2 | b 2 | c 2 | d 2 ]
[a 3 | b 3 | c 3 + c 3 | d 3 + d 3 ]
[a 4 | b 4 | c 4 + c 4 | d 4 + d 4 ]


为了将数组拆分为较小的块,这是我想到的:

/**
* @param larger the larger array to be split into sub arrays of size chunksize
* @param chunksize the size of each sub array
* @precond chunksize > 0 && larger != null
* @throws ArrayIndexOutOfBoundsException, NullPointerException
*/
public static List<double[][]> chunks(double [][]larger, int chunksize) throws 
    ArrayIndexOutOfBoundsException, NullPointerException  {
    if (chunksize <= 0)
        throw new ArrayIndexOutOfBoundsException("Chunks must be atleast 1x1");
    int size = larger.length / chunksize * (larger[0].length / chunksize);
    List<double[][]> subArrays = new ArrayList<>();

    for (int c = 0; c < size; c++) {
        double[][] sub = new double[chunksize][chunksize];
        int startx = (chunksize * (c / chunksize)) % larger.length;
        int starty = (chunksize * c) % larger[0].length;

        if (starty + chunksize > larger[0].length) {
            starty = 0;
        }

        for (int row = 0; row < chunksize; row++) {
            for (int col = 0; col < chunksize; col++) {
                sub[row][col] = larger[startx + row][col + starty];
            }
        }
        subArrays.add(sub);
    }

    return subArrays;
}

我还没有测试过,但是您可以使用已有的代码轻松地对其进行测试。

用法示例: http //ideone.com/D5Tdgs

暂无
暂无

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

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