2009-11-13 250 views
12

我有两个阵列的国际象棋变体我正在编写的Java ...我有一个控制台版本到目前为止代表董事会作为一维数组(大小为32),但我我正在为它做一个图形用户界面,我希望它看起来像一个4x8的网格,所以我有一个2维数组的JPanels ...将二维数组索引转换为一维索引

问题是,是否有任何公式可以转换数组[i ] [j]索引到数组[我]给了它一个4x8数组的事实?

回答

15

鉴于4列8行,则:

i = row * 4 + col 

编辑:我不好,没人抓我的这个错误很明显。但它实际上应该是row * 4 + col

row * 8 + col会在可能的索引中留下不必要的空白。

+0

我不能相信我没有得到这样的笑......我(I * 4)+ (我* 8)难怪这是出界,谢谢你! – Becky 2009-11-13 18:22:33

+0

非常欢迎。最近我学习了一个Tic Tac Toe游戏,我不得不做同样的事情。将过去的举措存储为单一指数是提高效率的一个步骤。 – 2009-11-13 18:43:14

+0

我总是不断回到这个答案,出于某种原因,我只是无法找到一种方法来记住这个方程'index = x + y * num_cols;'会很好地添加我们推断它的方式! – vexe 2015-11-20 18:02:27

3

i*8+j(假设8横向宽度)

8

2D阵列中的每一行都被放置在您的一维数组中。 i给出你所在的行,j给出列(该行到多远)。所以如果你在ith行,你需要将i完整的行首尾相连,然后再附加j以获得你的单个数组索引。

因此,这将是像
singleDimIndex = array[0].length * i + j

17

认为它是这样的:

你有一个数组,恰好是一个一个维数组,这真的是一个项目只是一个长期串联的二维数组。

因此,假设您有一个尺寸为5 x 3(5行,3列)的二维数组。我们想制作一维数组。您需要决定是否要按行或按列进行连接,对于此示例,我们会说连接按行进行。因此,每行都是3列长,所以你需要把你的一维数组看作是在3的“steps”中定义的。所以,你的一维数组的长度将是5 x 3 = 15,现在你需要找到接入点。因此,假设你正在访问你的二维数组的第二行和第二列,那么这将结束为3步(第一行)+第二行的步数,或3 + 2 = 5.由于我们是从零开始的索引是-1,所以这将是在指数现在4.

的具体配方:

int oneDindex = (row * length_of_row) + column; // Indexes 

所以,作为上述一个例子会风up up

oneDindex = (1 * 3) + 1 

而且应该是这样的

+1

太棒了!非常感谢您解释如何达到配方! – teo 2012-08-25 19:41:48

+0

@迈克尔这是一个很好的解释,甚至+1你可以请详细说明这一点“所以,假设你正在访问你的二维数组的第二行和第二列,那么最终结果是3步(第一行)+第二行中的步数,或者3 + 2 = 5。因为我们是基于零的索引,所以这是索引4。更好。更好地解释它。 – 2014-11-30 05:37:39

0

您可以使用此ArrayConvertor类将一维数组中的二维数组转换回来。

请注意:将二维数组转换为正常数组只适用于矩阵。

public class ArrayConvertor { 
    static public int[] d2Tod1(int[][] array){ 

     int[] newArray = new int[array.length*array[0].length]; 

     for (int i = 0; i < array.length; ++i) 
     for (int j = 0; j < array[i].length; ++j) { 
      newArray[i*array[0].length+j] = array[i][j]; 
     } 

     return newArray; 
    } 

    static public int[][] d1Tod2(int[] array, int width){ 

     int[][] newArray = new int[array.length/width][width]; 

     for (int i = 0; i < array.length; ++i) { 
      newArray[i/width][i%width] = array[i]; 
     } 

     return newArray; 
    } 
} 

以及一些测试代码:

public class JavaMain{ 
    public static void main(String[] args) { 
     int[][] arr2D_1 = new int[4][8]; 

     byte counter=0; 
     for (int i = 0; i < 4; i++) 
     for (int j = 0; j < 8; j++) { 
      arr2D_1[i][j] = counter++; 
     } 

     int[]arr1D = ArrayConvertor.d2Tod1(arr2D_1); 
     int[][] arr2D_2 = ArrayConvertor.d1Tod2(arr1D, 8); 

     boolean equal = true; 
     for (int i = 0; i < arr2D_1.length; i++) 
     for (int j = 0; j < arr2D_1[0].length; j++){ 
      if(arr2D_1[i][j]!=arr2D_2[i][j]) equal=false; 
     } 

     System.out.println("Equal: "+equal); 
    } 
} 

输出:平等:真

+0

如果您的数组大于8,我不认为这可行! – schwiz 2017-05-24 23:12:38