【问题标题】:Java generic array deep copy and cloning generic objectJava泛型数组深拷贝和克隆泛型对象
【发布时间】:2019-01-06 03:42:03
【问题描述】:

我想做一个 n 维原始数组的深拷贝。

public static double[] deepCopy(double[] arr) {
    return arr.clone();
}

public static double[][] deepCopy(double[][] arr) {
    arr = arr.clone();
    for (int i = 0; i < arr.length; i++) {
        arr[i] = deepCopy(arr[i]);
    }
    return arr;
}

public static double[][][] deepCopy(double[][][] arr) {
    arr = arr.clone();
    for (int i = 0; i < arr.length; i++) {
        arr[i] = deepCopy(arr[i]);
    }
    return arr;
}

以上是深度复制 1、2 和 3 维双精度数组的代码。我想概括任何原始类型和/或概括数组的维度。我想要两者,但我知道 Java 中的很多事情是不可能的,所以如果你只能得到一个也没关系,或者告诉我为什么它不起作用。

谢谢!

【问题讨论】:

  • 有什么方法可以对原始类型的 n 维数组进行深拷贝?我只需要克隆,因为我将克隆数组。
  • “有什么办法吗?是的,通过写一些代码来做到这一点。
  • @Andreas 回复没有帮助根本。我想要一种基于抽象维度数组的方法。我已经有了可以处理 1、2 和 3 维数组的代码,我正在寻找抽象。
  • 你已经有代码了?嗯....我似乎在您的问题的任何地方都看不到这一点。 --- idownvotedbecau.se/nocode
  • 我现在添加了代码。

标签: java arrays generics clone


【解决方案1】:

要深度复制多维数组,请使用以下代码。

请注意,这只是 array 值的深拷贝,而不是数组中任何非数组值的深拷贝,因此该拷贝只对多维原始数组才是真正深的。对于多维对象数组来说是深浅的。

数组的声明类型无关紧要。例如。 Object[][] 可以包含数组对象,使其(部分)成为 3D 数组。那些第三维数组也被复制了。

该方法将复制一维对象数组,但不复制一维原始数组。要复制一维原始数组,请使用clone()

@SuppressWarnings("unchecked")
public static <T> T[] deepCopyArray(T[] array) {
    return (T[]) deepCopyArrayInternal(array);
}
private static Object deepCopyArrayInternal(Object array) {
    int length = Array.getLength(array);
    Object copy = Array.newInstance(array.getClass().getComponentType(), length);
    for (int i = 0; i < length; i++) {
        Object value = Array.get(array, i);
        if (value != null && value.getClass().isArray())
            value = deepCopyArrayInternal(value);
        Array.set(copy, i, value);
    }
    return copy;
}

【讨论】:

  • 非常感谢!这确实有很大帮助。
猜你喜欢
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
相关资源
最近更新 更多