将2D数组拆分为更小的同等大小的2D子阵列

时间:2017-11-15 17:18:42

标签: java

基本上我要问的是一个正方形的2D数组和一个有效的补丁大小(2D子阵列的大小)我将如何做到这一点。 最终我不需要以任何方式存储子数组,我只需要找到每个子数组的中位数并将它们存储在一维数组中。新的数组的中位数和存储对我来说很简单,我只是无法弄清楚如何去处理原始的二维数组并正确地拆分它。 我已经多次尝试过并且不断出错。 我有一个4x4:

[1,2,3,4] [2,3,4,1] [3,4,1,2] [4,1,2,3]

我需要像这样分开它

[1,2] [3,4] [2,3] [4,1]

[3,4] [1,2] [4,1] [2,3]

然后取每个的中位数并将它们存储到一个新的一维数组中。

编辑:解决了,谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

您可以使用Arrays.copyOfRange(Object[] src, int from, int to)来执行以下操作:

src是源1D数组

from是要复制的范围的初始索引,包括在内。

to是要复制的范围的最终索引,不包括。

我不喜欢你的代码,因为它似乎时间复杂度太高了。

尝试以下代码:

public class Temp {
    public static void main(String[] args) {
        int[][] arr = { { 1,2,3,4 },
                        { 2,3,4,1 },
                        { 3,4,1,2 },
                        { 4,1,2,3 } };

        int patch = 2;

        splitToSubArrays(arr, patch);

    }

    static void splitToSubArrays(int arr[][], int patch) {
        for (int i = 0; i < arr[0].length; i++) {
            int to = patch;
            for (int from = 0; to <= arr.length;) {
                int a[] = Arrays.copyOfRange(arr[i], from, to);
                // instead of printing you can store in a separate array for later usage
                System.out.println(Arrays.toString(a));
                to += patch;
                from += patch;
            }
        }
    }

}

编辑: 注意:对于n*n数组n%patch不是0,即维度不能被{{1}整除然后你需要在patch使用正确的if条件来控制索引边界。希望你知道这一点。

<强> 输出

int a[] = Arrays.copyOfRange(arr[i], from, to);

答案 1 :(得分:0)

我认为这样的事情可以做到,尽管我没有对它进行测试,但它应该让你知道如何进行这种扫描

public int[] patchArray(int[][] img, int patch)
{
    int size = img.length * (img[0].length / patch) ;
    int[] pArray = new int[size];
    int[] tmp = new int[patch];

    for (int row_i = 0; row_i < img.length; row_i++)
    {
        for (int patch_start = 0; patch_start < img[i].length; patch_start += patch)
        {
            int x = 0;
            for (int patch_i = patch_start; patch_i < (patch_start + patch); patch_i++)
            {
                tmp[patch_i - patch_start] = img[row_i][patch_i];
            }

            calculateMedian(tmp);
        }
    }

    return pArray;
}