gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:15:14 24 4
gpt4 key购买 nike

我已经尝试了所有我能想到的方法,并在网上到处搜索,但我无法让它工作。下面我有两个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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com