【问题标题】:Shift all elements in a 2-dimensional array down将二维数组中的所有元素向下移动
【发布时间】:2014-12-21 19:49:01
【问题描述】:

我想知道是否有一种减少二维数组中所有非零元素的行索引的好方法。例如,将所有非零元素向左移动:

[0, 1, 0, 1, 1] =>
[1, 0, 1, 1, 0]

一个简单的算法显然是:

for (int[] row : array) {
    for (int i = 0; i < row.length - 1; i++) {
        row[i] = row[i + 1];
    }

    row[row.length - 1] = 0;
}

我也可以这样:

for (int[] row : array) {
    System.arraycopy(row, 1, row, 0, row.length - 1);
    row[row.length - 1] = 0;
}

将所有元素从索引向下移动的简单算法:

for (int col = 0; col < arr[0].length; col++) {
    for (int row = index; row > 0; row--) {
        arr[row][col] = arr[row - 1][col];
    }
}

但是,在使用行索引时,我不能这样做 System.arraycopy

现在我想知道的是,除了像上面那样循环遍历整个矩阵之外,还有更好的方法向下移动元素吗?

【问题讨论】:

  • 你打算用这个做什么?你能在你只带尾巴的地方使用链表吗?可以用循环数组吗?
  • 我正在实现一个俄罗斯方块游戏。当一行被填满时,它上面的所有行都应该下降一个级别(游戏区域以二维矩阵表示)。我想我可以将元素存储在[x][y] 数组而不是[y][x] 中,然后我可以对其进行arraycopy,但我想我还是会问一下,以防出现一个很好的方法。
  • 您可以拥有 2 个这样的数组,并使用 System.arrayCopy 从一个数组复制到另一个数组。您仍然可以获得速度,并且如果您重新使用数组,您不会占用 GC。对于游戏而言,此处循环可能太慢(取决于棋盘大小)。

标签: java arrays algorithm


【解决方案1】:

现在我想知道的是,除了像上面那样循环遍历整个矩阵之外,还有没有更好的方法来向下移动元素?

更好地定义:-)。

没有办法摆脱将提高性能或(IMO)可读性的外部循环。

对于内部循环,如果数组很小,使用 arraycopy 的性能优势可能很小......甚至是负面的。

如果您有证据表明性能确实会产生实际影响,那么我建议:

  1. 分析代码以验证这一点。

  2. 尝试两种(和其他)替代方案并测量对您的整体应用程序的影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2014-05-06
    • 2013-05-16
    • 2013-01-29
    • 1970-01-01
    相关资源
    最近更新 更多