我有一个用于国际象棋变体的两个数组我在java中编码...到目前为止我有一个控制台版本,它代表了一个1D数组(大小为32),但我正在为它制作一个GUI我希望它显示为4x8网格,所以我有一个JP维尔的二维数组......
问题是,是否有任何公式可以将array [i] [j]索引转换为array [i],因为它是一个4x8数组?
答案 0 :(得分:19)
这样想:
你有一个恰好是一维数组的数组,实际上,它只是二维数组项的长连接。
所以,假设你有一个大小为5 x 3(5行,3列)的二维数组。我们想制作一维数组。您需要决定是按行还是按行连接,对于此示例,我们将说明串联是按行进行的。因此,每行的长度为3列,因此您需要将您的一维数组视为在3的“步骤”中定义。因此,您的一维数组的长度将为5 x 3 = 15,现在您需要找到接入点。
所以,假设您正在访问二维数组的第二行和第二列,那么最终将是3步(第一行)+第二行中的步数,或者3 + 2 = 5因为我们是基于零的索引,它是-1,所以它将在索引4处。
现在具体的表述:
int oneDindex = (row * length_of_row) + column; // Indexes
所以,作为上述例子,你最终会有
oneDindex = (1 * 3) + 1
应该是它
答案 1 :(得分:16)
根据8行给出4列,然后:
i = row * 4 + col
编辑:我的不好,显然没有人抓住我这个错误。但实际应该是row * 4 + col
。
row * 8 + col
会在可能的索引中留下不必要的空白。
答案 2 :(得分:9)
2D阵列中的每一行都是在一维数组中首尾相连。 i
给出了您所在的行,j
给出了该列(该行的距离)。因此,如果您位于ith
行,则需要端对端放置i
个完整行,然后将j
更多地添加到其中以获取单个数组索引。
所以它会像是一样
singleDimIndex = array[0].length * i + j
答案 3 :(得分:3)
i*8+j
(假设8是水平宽度)
答案 4 :(得分:1)
您可以使用此ArrayConvertor类在1D数组中转换2D数组并返回。
注意:将2D数组转换为普通数组仅适用于矩阵。
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);
}
}
输出:等于:是
答案 5 :(得分:0)
如果二维数组是 4 宽。 我们有一个元素的 pos x 和 pos y 。
我们需要它的索引。 怎么做?
看看它有 12 个元素的数组。
如果您想转到第 6 个元素,请转到第 2 行的第 2 个元素。
1 2 3 4 5 6 7 8 9 10 11 12
列是 1,2,3,4 行是: 1、 5、 9、
元素 1 在 2d 中是 (0,0)。
所以使用这个 = pos.y * width + pos.x ;