【问题标题】:How to elegantly copy multidimensional arrays in Java?如何优雅地在 Java 中复制多维数组?
【发布时间】:2012-03-12 06:14:15
【问题描述】:

在发现 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 arrays clone


【解决方案1】:

我不知道有更通用的方法来做到这一点。我会简单地定义一个函数来做到这一点。

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

然后我每次都会简单地调用该函数。

 copyMultidimensionalArray(grid_copy,grid);

没有比这更优雅的了,可以吗?

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

【讨论】:

  • 谢谢。我会尝试,但更优雅的是根本不指定三个维度并将其用于任何维度。
  • 是的,但我认为出于所有实际目的,多维通常会上升到 3 个维度。因此,您可以将其硬编码为二维副本和三维副本。
【解决方案2】:

official tutorial 解释了如何使用arraycopy 方法有效地将数据从一个数组复制到另一个数组。我认为它仅适用于一维数组,但您可以使用它来复制包含在三维网格中的各种“一维数组块”。您可能会发现它很有用!

【讨论】:

  • 谢谢。这应该是最快的方法,但绝不是优雅的。在问这个问题之前,我已经找到了标准方法的一个很好的比较(javapractices.com/topic/TopicAction.do?Id=3)。我仍然希望有人可能知道一些不那么低级的东西。
【解决方案3】:

如果你真的想要一个通用的复印机,我只是在这里做了一些基本的测试。这很有趣,但我不认为它更好,因为您在灵活性方面获得的收益会在可读性方面有所损失。

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));
            }
        }
    }
}

【讨论】:

  • 这是唯一通用的方法。 (是的,它很丑。)你不会找到更好的方法。
  • 这绝对是一个解决方案!但不幸的是,它相当慢(可能是由于递归)。在我的应用程序中,我测得它比硬编码版本慢两倍以上。
  • @LouisWasserman 只有一般的方式?像这样返回一个完全独立构建的副本怎么样:stackoverflow.com/a/16256146/1493294 有时你更关心的是不被强迫思考而不是速度。
  • 除了创建一个新的输出数组之外,这种方法似乎是等效的,我故意不这样做,因为 OP 的问题没有要求它。
猜你喜欢
  • 2016-05-02
  • 2018-09-11
  • 1970-01-01
  • 2013-02-25
  • 2012-02-24
  • 2011-02-14
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多