我有两个阵列的国际象棋变体我正在编写的Java ...我有一个控制台版本到目前为止代表董事会作为一维数组(大小为32),但我我正在为它做一个图形用户界面,我希望它看起来像一个4x8的网格,所以我有一个2维数组的JPanels ...将二维数组索引转换为一维索引
问题是,是否有任何公式可以转换数组[i ] [j]索引到数组[我]给了它一个4x8数组的事实?
我有两个阵列的国际象棋变体我正在编写的Java ...我有一个控制台版本到目前为止代表董事会作为一维数组(大小为32),但我我正在为它做一个图形用户界面,我希望它看起来像一个4x8的网格,所以我有一个2维数组的JPanels ...将二维数组索引转换为一维索引
问题是,是否有任何公式可以转换数组[i ] [j]索引到数组[我]给了它一个4x8数组的事实?
鉴于4列8行,则:
i = row * 4 + col
编辑:我不好,没人抓我的这个错误很明显。但它实际上应该是row * 4 + col
。
row * 8 + col
会在可能的索引中留下不必要的空白。
i*8+j
(假设8横向宽度)
2D阵列中的每一行都被放置在您的一维数组中。 i
给出你所在的行,j
给出列(该行到多远)。所以如果你在ith
行,你需要将i
完整的行首尾相连,然后再附加j
以获得你的单个数组索引。
因此,这将是像
singleDimIndex = array[0].length * i + j
认为它是这样的:
你有一个数组,恰好是一个一个维数组,这真的是一个项目只是一个长期串联的二维数组。
因此,假设您有一个尺寸为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
而且应该是这样的
太棒了!非常感谢您解释如何达到配方! – teo 2012-08-25 19:41:48
@迈克尔这是一个很好的解释,甚至+1你可以请详细说明这一点“所以,假设你正在访问你的二维数组的第二行和第二列,那么最终结果是3步(第一行)+第二行中的步数,或者3 + 2 = 5。因为我们是基于零的索引,所以这是索引4。更好。更好地解释它。 – 2014-11-30 05:37:39
您可以使用此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);
}
}
输出:平等:真
如果您的数组大于8,我不认为这可行! – schwiz 2017-05-24 23:12:38
我不能相信我没有得到这样的笑......我(I * 4)+ (我* 8)难怪这是出界,谢谢你! – Becky 2009-11-13 18:22:33
非常欢迎。最近我学习了一个Tic Tac Toe游戏,我不得不做同样的事情。将过去的举措存储为单一指数是提高效率的一个步骤。 – 2009-11-13 18:43:14
我总是不断回到这个答案,出于某种原因,我只是无法找到一种方法来记住这个方程'index = x + y * num_cols;'会很好地添加我们推断它的方式! – vexe 2015-11-20 18:02:27