【问题标题】:Convert a 2D array index into a 1D index将二维数组索引转换为一维索引
【发布时间】:2022-01-05 11:50:11
【问题描述】:

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

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

【问题讨论】:

    标签: java arrays


    【解决方案1】:

    这样想:

    您有一个数组,它恰好是一维数组,实际上,它只是二维数组项的长串联。

    假设您有一个大小为 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
    

    应该就是这样

    【讨论】:

    • 太棒了!非常感谢您解释如何获得公式!
    • @Michael 这是一个很好的解释,甚至 +1 u,但你能详细说明一下吗“所以,假设你正在访问二维数组的第二行和第二列,那么这会风最多为 3 步(第一行)+ 第二行中的步数,或 3 + 2 = 5。由于我们是从零开始的索引,即 -1,因此索引为 4。”更好的。解释得更好。
    【解决方案2】:

    给定 4 列乘 8 行然后:

    i = row * 4 + col
    

    编辑:我的错,显然没有人发现我这个错误。但实际上应该是row * 4 + col

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

    【讨论】:

    • 我不敢相信我没有得到那个大声笑...我有 (i*4)+(i*8) 难怪它越界了,谢谢!
    • 不客气。最近我不得不用一个学习的井字游戏来做同样的事情。将过去的移动存储为单个索引是提高效率的一步。
    • 我总是不断地回到这个答案,由于某种原因,我无法找到一种方法来记住这个等式index = x + y * num_cols; 会很高兴添加我们如何推断它!
    • 简洁优雅。
    【解决方案3】:

    您的二维数组中的每一行都在您的一维数组中首尾相连。 i 给出您所在的行,j 给出列(该行的距离)。因此,如果您在 ith 行中,则需要将 i 完整的行首尾相连,然后将 j 更多附加到该行上以获得单个数组索引。

    所以它会像
    singleDimIndex = array[0].length * i + j

    【讨论】:

      【解决方案4】:

      i*8+j(假设水平宽度为8)

      【讨论】:

        【解决方案5】:

        您可以使用此 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);
            }
        }
        

        输出:等于:真

        【讨论】:

        • 如果你的数组大于 8,我认为这不起作用!!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-22
        • 1970-01-01
        • 2019-10-02
        • 1970-01-01
        • 2013-05-23
        • 2012-07-20
        相关资源
        最近更新 更多