将二维坐标对的数组转换为一维数组的整数索引

3
阅读了10多个有关将整个二维数组转换为一维数组和反之的线程后,我想知道是否有一个数学公式,不需要迭代,就可以返回已排序的二维数组中一对整数的索引位置。
我的“网格”总是正方形的,可以是任何大小(在此示例中为3x3),我有一个人性化值的排序块,需要从中检索我所称的“真实1D索引”,如下所示:
"Human-friendly" coordinates| Java 2D Indices    |  True 1D indices
    [1,1],[1,2],[1,3],  ==>   [0,0],[0,1],[0,2], ==>  0 , 1 , 2
    [2,1],[2,2],[2,3],  ==>   [1,0],[1,1],[1,2], ==>  3 , 4 , 5
    [3,1],[3,2],[3,3],  ==>   [2,0],[2,1],[2,2], ==>  6 , 7 , 8

我需要一个方法使我的类能够给我以下结果:

我输入1,1,然后得到0, 我输入3,2,然后得到7, 我输入2,3,然后得到5, 等等...

我尝试过半打方程式,比如将坐标加上前一行索引的平方,但我无法为网格中的每个单元格获得正确的结果。我是否缺少某些特殊运算符或Math函数?

谢谢。

2个回答

2

假设矩阵为3*3,即3行3列,我们需要找到(i,j)的索引,则公式为: indices= 3*(i-1)+j;

注意:这里的3*3和i、j不是Java 2D数组格式,而是人类友好坐标。

例如 (i,j)=(2,3) indices=3*(2-1)+3 =6 由于您的索引从0开始,因此您可以直接从6中减去1,即5。


我认为你已经明白了。因此,第一个常量是以人类友好的形式表示的总行数。在括号中最后减去1与使用Java行列值本质上是相同的。因此,当我测试(N-rows * Java-row)+ Java_column时,我可以得到所有9个单元格的正确答案。请问您是如何知道这一点的?这是数组展平的常见公式吗?它有一个适当的名称吗?非常感谢。 - JacobIRR
1
不,我只是尝试为数组的不同值单独设置不同的公式,最后找到了这个公式。我不知道这个公式是否有一个正式的名称。 - bit-shashank

0

如果索引被命名为 [index1, index2],

1DIndex = (rowNumber*index1) + index2

其中rowNumber从第一行开始计数,index1和index2是Java的索引。


如果我输入3,2并希望返回7,那在你的示例中会是什么样子? - JacobIRR
你的Java索引比输入索引少1。因此,你的方法首先会将它们都减1变成2,1。然后,2,1在一个3x3矩阵的第三行,所以3*2+1=7。 - dukr
因此,您还需要知道网格的大小才能知道行号。 - dukr
对于第二行,当我输入2,1时,你的方法说我应该这样做:(2 * 1) + 0 ……这等于“2”,但是在位置2,1上的数字实际上是“3”。 - JacobIRR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接