0

使用 Java 时,使用多维数组时似乎会显着放缓:-

int[] oneDArray=new int[3000*3000];
int[][] twoDArray=new int[3000][3000];

for(int x=0;x<oneDArray.length;x++){
   oneDArray[x]=x;
}



for(int x=0;x<twoDArray.length;x++){
    for(int y=0;y<twoDArray[0].length;y++){
        twoDArray[x][y]=x;
    }
}

结果是:1d 需要 4 ms,2d 需要 15ms,这在执行图形功能时是相当大的延迟。

如何在 Java 中仅用一个数组表示 2d 坐标?

4

5 回答 5

5
int w = 3000;
int h = 3000;

int[] array = new int[w * h];

/* Here is how to calculate the index for a specific (x, y) */
int index = y * w + x;

array[index] = 5;
于 2013-02-08T13:22:11.023 回答
1

使用一维数组来表示二维数据是很常见的。例如,您可以像这样翻译索引:

1Dindex = xIndex + IMAGE_WIDTH*yIndex
于 2013-02-08T13:22:23.570 回答
1

对于所有行长度相同的矩形数组,您可以简单地使用oneDArray[x*3000 + y]在矩形中的位置 (x, y) 保存值的约定。

于 2013-02-08T13:22:25.907 回答
0

选项1:

使用对对象的一维数组Pair[]

class Pair {
  int x;
  int y;
}

选项 2:

使用 1D 和 2D 之间的算术变换:例如,尺寸为 100 * 200;

然后a[i, j] = a[i * 200 + j]

于 2013-02-08T13:24:17.107 回答
0

如何通过混合坐标来线性化数组?数组的所有偶数元素可能与 x 相关,奇数元素与 y 相关。如果你成对挑选它们,写起来就更容易了。

像这样的东西:

x = [x1, x2, x3, x4, ..... , x3000] 
y = [y1, y2, y3, y4, ..... , y3000]

并将其替换为:

data = [x1, y1, x2, y2, x3, y3, x4, y4, ...... , x3000, y3000]

然后,您可以从中选择所有偶数元素来获取 x 和奇数元素来获取 y。这样做的一个好处是您可以执行以下操作:

coord (point in position i) = [data [2i], data[2i+1]] 

将 i 点的坐标带回家。

否则,我绝对同意通过首先执行所有 xs 然后执行 ys 来线性化数组,就像其他人建议的那样。

于 2013-02-08T13:24:31.423 回答