我已经尝试了所有我能想到的东西,并且已经在网上搜索过它,但我无法让它发挥作用。下面我有两种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;
}
谢谢。
答案 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;
}
}