如何优雅地在Java中复制多维数组?

4

在发现clone()对于多维数组无法按预期工作后,我现在编写如下代码:

for(int k = 0; k < Nz; k++){
    for(int j = 0; j < Ny; j++){
        for(int i = 0; i < Nx; i++){
            grid_copy[i][j][k] = grid[i][j][k];
        }
    }
}           

对于每个数组,这感觉非常低级和反 DRY。有人能提出更通用的方法吗?


可能是Java中多维数组的深度克隆...?的重复问题。 - Brian Roach
3个回答

2

如果你真的非常需要一个通用的复印机,我在这里为你准备了一个,并进行了基本测试。虽然它很有趣,但我认为它并没有更好,因为你在灵活性上所获得的优势会失去在可读性上。

private void copy(Object source, Object dest) {
    if(source.getClass().isArray() && dest.getClass().isArray()) {
        for(int i=0;i<Array.getLength(source); i++) {
            if(Array.get(source, i) != null && Array.get(source, i).getClass().isArray()) {
                copy(Array.get(source, i), Array.get(dest, i));
            } else {
                Array.set(dest, i, Array.get(source, i));
            }
        }
    }
}

这是唯一通用的方法。(是的,它很丑。)你不会找到更好的方法。 - Louis Wasserman
这绝对是一个解决方案!但不幸的是它相当慢(可能由于递归)。在我的应用程序中,我已经测量过它比硬编码版本慢两倍以上。 - Ivan Lappo-Danilevski
@LouisWasserman 只有一般的方法吗?像这样完全独立构建一个副本然后返回它怎么样:https://dev59.com/4HI_5IYBdhLWcg3wBuJs#16256146 有时候你更在意不被迫思考而不是速度。 - candied_orange
那种方法看起来是等价的,除了创建一个新的输出数组,我故意没有这样做,因为OP的问题没有要求。 - Louis Wasserman

2

这个官方教程解释了如何使用arraycopy方法来高效地将数据从一个数组复制到另一个数组中。我认为它只适用于一维数组,但是你可以使用它来复制包含在三维网格中的各种“一维数组块”。你可能会觉得它很有用!


谢谢。那应该是最快的方法,但绝不优雅。在提问之前,我已经找到了一个很好的标准方法比较(http://www.javapractices.com/topic/TopicAction.do?Id=3)。我仍然希望有人知道更高级的方法。 - Ivan Lappo-Danilevski

0

我不知道有更一般的方法来做这个。我只会定义一个函数来完成它。

  public void copyMultidimensionalArray(int[][][] destination,int[][][] source)
    {
        // your above code here   
    }

然后,每次我只需要调用那个函数。
 copyMultidimensionalArray(grid_copy,grid);

还有比这更优雅的吗?

请注意,上面的示例仅使用整数数组。当然,您可以使用Object类型的数组使其更加通用。


谢谢。我会尝试,但更优雅的方法是根本不指定三个维度,而是将其用于任何维度。 - Ivan Lappo-Danilevski
是的,但我认为在实际应用中,多维通常只涉及到3个维度。因此,您可以将其硬编码为二维复制和三维复制。 - CodeBlue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接