将2D数组索引转换为1D索引

时间:2009-11-13 18:16:23

标签: java arrays

我有一个用于国际象棋变体的两个数组我在java中编码...到目前为止我有一个控制台版本,它代表了一个1D数组(大小为32),但我正在为它制作一个GUI我希望它显示为4x8网格,所以我有一个JP维尔的二维数组......

问题是,是否有任何公式可以将array [i] [j]索引转换为array [i],因为它是一个4x8数组?

6 个答案:

答案 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 ;