每行或每列迭代二维数组的正确方法是什么



在大学里,我和几个朋友在玩一个游戏,我们必须从.txt加载关卡,以我们选择的数据格式保存,然后很明显地将其显示在屏幕上。我们决定了一个二维的char数组,在编写级别解析器时,我逐行填充它。为了更具描述性,我摘录了我使用的代码:

unconverted = "#####n" + "#___#n" + "#S>X#n" + "#___#n" + "#####" // sample data
while(z < unconverted.length())
    {
        current = unconverted.charAt(z);
        if(current == 'S' || current == 'X' || current == '<' || current == 'v' || current == '>' || current == '^' || current == '_' || current == '#' ||current == 't')
        {
            level[x][y] = current;
            x++; 
        }
        else if (current =='n')
        {
            x=0;
            y++;
        }
        else
        {
            System.out.println("Level null because of an unrecognised character");
            level = null;
            return level;
        }
        z++;
    }

到目前为止,它运行良好,但我们真的没想到会出现问题。其他人不知道他们会得到一个字符[][],这似乎是足够的信息。。。但事实并非如此!出现的问题是,在游戏逻辑和GUI的不同点上,数组是按行或按列读取的,这意味着例如,关卡的显示是在它的头上打开的。

这显然花费了我们相当多的时间来修复代码,使其再次保持一致。因此,对于未来,我想就什么是公认的"正确"方式(如果有的话)提出一些建议:按行或按列填充和访问二维数组?此外,这两种方法之间是否存在任何性能差异?我的常识是,填充二维第一

非常感谢!

没有"正确"的方法。根据具体情况,任何一种都可能是最好的。

想想二叉树。哪种方式是"正确的":广度优先,深度优先,还是其他方式?(提示:这取决于上下文。)

下面是另一个例子:您可以这样看待数据库中的关系表,即每一行都是表示实体的元组。但有些人,比如Michael Stonebreaker,认为基于专栏的表述在某些情况下是有利的。

还有一点:如果你有一个m行n列的矩阵,哪种方式更好?(提示:这并不重要。)当您进行LU分解时,通常是通过对行进行迭代来完成的。找到透视图,将该行中的所有条目除以它,然后消除透视图下的所有行。在这种情况下,按行工作是有意义的。

简介:这就是2D阵列在内存中的布局方式。

因此缓存效率的方法是迭代最后一个索引,同时保持相同的第一个索引。这对于庞大的基元类型数组来说可能是有意义的,例如在数值算法中。

我想在你的情况下不会有什么不同。使用最合乎逻辑的方式。

相关内容

最新更新