基本上我要问的是一个正方形的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]
然后取每个的中位数并将它们存储到一个新的一维数组中。
编辑:解决了,谢谢你的帮助!答案 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;
}