Java - 使用递归的深度克隆数组;未知类型和未知深度

时间:2013-11-17 03:53:38

标签: java arrays recursion multidimensional-array clone

我已经尝试了所有我能想到的东西,并且已经在网上搜索过它,但我无法让它发挥作用。下面我有两种Java方法,第一种是我成功开始工作,另一种是我无法工作。第一种方法printArray()接受任何数组,无论对象类型和维数如何,都将结果打印到屏幕上。该方法以递归方式执行此操作,这意味着它在自身内部调用自身并以此方式遍历每个维度。

对于第二种方法deepClone(),我还需要它来接受任何数组,并返回一个深层副本。它的设置方式,我可以克隆最左边的维度,而不是其他维度。克隆数组中的每个维度都需要在内存中引用自己的位置。无论我在哪里放置递归(deepClone()方法调用),函数似乎都不会改变它的行为方式,或者给出StackOverflowError。我也尝试将递归放在set方法和return语句中。

非常感谢任何帮助。我必须使用反射来做这个,并且方法必须是静态的。递归是可选的。任何建议的实现方式,无论是递归地还是通过其他方式,都非常感激。

public static void printArray(Object array) { // This method works fine
    if (array.getClass().isArray())
        for (int i = 0; i < Array.getLength(array); i++) {
            printArray(Array.get(array, i));
            System.out.println();
        }
    else
        System.out.print("{" + array + "} ");
}

public static Object deepClone(Object array) { // This method does not work properly
    Class c = array.getClass().getComponentType();
    Object newArray = new Object();
    if (c.isArray()) {
        newArray = Array.newInstance(c, Array.getLength(array));
        for (int i = 0; i < Array.getLength(newArray); i++) {
            deepClone(Array.get(array, i));
            Array.set(newArray, i, Array.get(array, i));
        }
    }
    return newArray;
}

谢谢。

1 个答案:

答案 0 :(得分:2)

你有很多问题。

(1)您只是制作克隆并将其丢弃,而不是从deepClone方法返回。

(2)你没有将原子从旧数组复制到新数组 - 你只是用未初始化的Object对象替换它们。

(3)你正在检查你要复制的东西是否是一个数组数组,你应该检查它是否是一个数组。

这是我的版本。请注意,这两个数组共享相同的原子,但数组本身是克隆的。

public static Object deepClone(Object toClone) { 
    Class<?> c = toClone.getClass();
    if (c.isArray()) {
        Object toReturn = Array.newInstance(c.getComponentType(), Array.getLength(toClone));
        for (int i = 0; i < Array.getLength(toReturn); i++) {
            Array.set(toReturn, i, deepClone(Array.get(toClone, i)));
        }
        return toReturn;
    }
    else {
        // toClone is an atom, so just return it
        return toClone;
    }
}