【问题标题】:What is the correct way to iterate over a two-dimensional array, per row or per column?每行或每列迭代二维数组的正确方法是什么?
【发布时间】:2012-03-17 12:50:47
【问题描述】:

在大学期间,我和几个朋友一起开发了一款游戏,我们必须从 .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++;
    }

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

这显然花费了我们很多时间来修复代码以使其再次保持一致。因此,对于未来,我想就普遍接受的“正确”方式提出一些建议,如果有的话:按行或按列填充和访问二维数组?此外,这两种方法之间是否有任何性能差异?我的常识会说首先填充第二个维度

非常感谢!

【问题讨论】:

  • 是的。但这是一个独立于编程语言的一般问题。该代码只是为了让我的问题更容易理解。
  • 好的,有道理。您介意发布一些示例数据吗?

标签: java multidimensional-array


【解决方案1】:

简介:that's how 2D arrays are laid out in memory.

所以 cache-efficeint 方法是迭代最后一个索引,同时保持相同的第一个索引。这可能对大量原始类型数组有意义,例如在数值算法中。

我想在您的情况下不会观察到差异。使用最合乎逻辑的方式。

【讨论】:

    【解决方案2】:

    没有“正确”的方式。任何一个都可以是最好的,这取决于上下文。

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

    这是另一个示例:您可以将数据库中的关系表视为这样一种方式,即每一行都是代表一个实体的元组。但是有些人,比如 Michael Stonebreaker,认为基于列的表示在某些情况下可能是有利的——等待它。

    还有一个:如果你有一个 m 行 n 列的矩阵,用哪种方式填充它更好? (提示:没关系。)当你进行 LU 分解时,通常是通过遍历行来完成的。您找到枢轴,将该行中的所有条目除以它,然后消除枢轴下的所有行。在这种情况下,按行工作是有意义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 2016-02-16
      • 2019-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多