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