【发布时间】: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。对于游戏而言,此处循环可能太慢(取决于棋盘大小)。