gpt4 book ai didi

java - 仅复制 3D 数组的前 2 个维度

转载 作者:搜寻专家 更新时间:2023-11-01 03:25:27 24 4
gpt4 key购买 nike

我将以下 3D 数组设置为两个程序状态之间的缓冲区。

private boolean state [][][] = new boolean [20][20][2];

我正在尝试从

复制所有内容
state[0-19][0-19][1]

state[0-19][0-19][0]

目前我正在使用 for 循环,它工作正常,但我不禁觉得有更好的方法。我知道我可以只使用两个单独的二维数组并进行简单的复制,但我很想知道是否有任何解决方法。

当前循环:

for (int i=0;i<20;i++){
for (int j=0;j<20;j++){
state[i][j][0]=state[i][j][1];
}
}

最佳答案

有时您可以用 System.arraycopy 替换内部循环,这样会更快。但我相信不在您的内存布局中。

如果可能,请考虑更新引用而不是复制数组。回想一下,Java 中的“多维”数组实际上是数组的数组。

特别是,

 boolean[] tmp = multi[0];
multi[0] = multi[1];
multi[1] = tmp;

以接近于零的成本交换两个数组引用。这比复制然后覆盖旧值要快很多。但有时你需要一个副本(如果你不覆盖旧值),那么你就不能这样做。

请注意,您不应该盲目地这样做:

 multi[0][0] = 1;
multi[1] = multi[0];
multi[1][0] = 0;
System.err.println(multi[0][0]);

将打印 0,因为现在 multi[0]multi[1] 指向同一个嵌套数组,你应该有用过。

 multi[1] = multi[0].clone();

请注意,克隆也不是深度,因此multi.clone() 将指向与multi 相同的嵌套数组。 Java 中没有内置的深度克隆或深度数组复制,无论哪种方式,您都需要使用循环。

但同样,如果您想将第二个元素复制到大量数组中的第一个元素,那么这些方法都不起作用。这是你内存布局的问题。

记忆一下你的数据结构在内存中的样子:

 boolean[][][] -> boolean[][] -> boolean[]{ 0, 1 }
\ \> boolean[]{ 0, 1 }
\> boolean[][] -> boolean[]{ 0, 1 }
\> boolean[]{ 0, 1 }

您想复制每个数组中的一个元素。它们可以遍布你的内存(每个 boolean[]... 都是它自己的对象!),所以没有办法用基元来加速它 -数据是分散的。如果可能的话,也许考虑改变你的内存布局

还要考虑 boolean 数组的替代方案。 boolean 值占用 1 个字节的内存,但只存储一位(请注意,这可以更快,所以它本身还不错!)。但有时将整个 boolean 数组存储在 BitSetlong 中,然后进行实际的位操作是有意义的。但是收获,有时确实有返回,有时会带来伤害。

关于java - 仅复制 3D 数组的前 2 个维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15109415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com