【发布时间】:2022-01-05 11:50:11
【问题描述】:
我有两个用于国际象棋变体的数组,我正在用 java 编码...到目前为止,我有一个控制台版本,它将棋盘表示为一维数组(大小为 32),但我正在为它制作一个 GUI,并且我希望它显示为 4x8 网格,所以我有一个二维数组 JPanels...
问题是,鉴于它是一个 4x8 数组,是否有任何公式可以将 array[i][j] 索引转换为 array[i]?
【问题讨论】:
我有两个用于国际象棋变体的数组,我正在用 java 编码...到目前为止,我有一个控制台版本,它将棋盘表示为一维数组(大小为 32),但我正在为它制作一个 GUI,并且我希望它显示为 4x8 网格,所以我有一个二维数组 JPanels...
问题是,鉴于它是一个 4x8 数组,是否有任何公式可以将 array[i][j] 索引转换为 array[i]?
【问题讨论】:
这样想:
您有一个数组,它恰好是一维数组,实际上,它只是二维数组项的长串联。
假设您有一个大小为 5 x 3(5 行,3 列)的二维数组。我们想要制作一个一维数组。您需要决定是按行还是按列连接,对于这个例子,我们会说连接是按行。因此,每行有 3 列长,因此您需要将一维数组视为以 3 的“步数”定义。因此,一维数组的长度将为 5 x 3 = 15,现在您需要找到接入点。
所以,假设您正在访问二维数组的第 2 行和第 2 列,那么这将是 3 步(第一行)+ 第二行中的步数,或 3 + 2 = 5 . 由于我们是从零开始的索引,即 -1,所以这将是索引 4。
现在是具体的表述:
int oneDindex = (row * length_of_row) + column; // Indexes
因此,作为上述示例,您最终会拥有
oneDindex = (1 * 3) + 1
应该就是这样
【讨论】:
给定 4 列乘 8 行然后:
i = row * 4 + col
编辑:我的错,显然没有人发现我这个错误。但实际上应该是row * 4 + col。
row * 8 + col 会在可能的索引中留下不必要的空白。
【讨论】:
index = x + y * num_cols; 会很高兴添加我们如何推断它!
您的二维数组中的每一行都在您的一维数组中首尾相连。 i 给出您所在的行,j 给出列(该行的距离)。因此,如果您在 ith 行中,则需要将 i 完整的行首尾相连,然后将 j 更多附加到该行上以获得单个数组索引。
所以它会像singleDimIndex = array[0].length * i + j
【讨论】:
i*8+j(假设水平宽度为8)
【讨论】:
您可以使用此 ArrayConvertor 类将 2D 数组转换为 1D 数组并返回。
注意:将二维数组转换为普通数组仅适用于矩阵。
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);
}
}
输出:等于:真
【讨论】: