对于大学我和几个朋友一起做游戏,我们不得不从.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中的各个点上,每行或每列都读取数组,这意味着例如水平的显示被打开了。
这显然花了我们很多时间来修复代码以使其再次保持一致。所以对于未来我想要一些关于通常被接受为“正确”方式的建议,如果有的话:按行或按列填充和访问二维数组?此外,这两种方法之间是否有任何性能差异?我的常识会说首先填补第二个维度
非常感谢!
答案 0 :(得分:2)
没有“正确”的方式。根据具体情况,任何一个都可能是最好的。
考虑二叉树。哪种是“正确的”方式:广度优先,深度优先还是其他? (提示:这取决于具体情况。)
这是另一个例子:您可以在数据库中考虑关系表,每个行都是表示实体的元组。但有些人,比如Michael Stonebreaker,认为基于列的表示可能是有利的 - 等待它 - 某些情境。
还有一个:如果你有一个包含m行和n列的矩阵,哪种方式更适合填充它? (提示:没关系。)当你进行LU分解时,通常是通过遍历行来完成的。找到枢轴,用它划分该行中的所有条目,然后消除枢轴下的所有行。在这种情况下,按行工作是有意义的。
答案 1 :(得分:2)
简介:that's how 2D arrays are laid out in memory。
所以 cache-efficeint 方法是迭代最后一个索引,同时保持相同的第一个索引。这对于巨大的基本类型数组可能有意义,例如在数值算法中。
我认为在你的情况下,没有观察到任何差异。使用最合乎逻辑的方式。