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

标签 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) 您只是创建克隆并将其丢弃,而不是从 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;
    }
}

关于Java - 使用递归的深度克隆数组;未知类型和未知深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20026994/

相关文章:

python - 如何将字节字符串拆分为单独的部分

python - 为什么这个输出每次都返回不同的值?

python - 如何从邻接列表构建嵌套树结构?

java - Spring集成测试-配置中的事务声明似乎破坏了测试

java - 如何检测屏幕切口(凹口)并获取其高度?

检查c中数组中的值

c - 对于数组,为什么会出现 a[5] == 5[a] 的情况?

go - 如何用两个手动调用替换简单的两匝回路(棘手)

java - spring boot 和 BlockingQueue 监听器

java - JTables,如何从文本文件向Jtable中插入数据