<T> T[] toArray(T[] array) 不修改原数组
<T> T[] toArray(T[] array) not modifying the original array
我编写了以下代码作为 BST 的实现。添加 toArray()
仅供参考。返回的数组工作得很好,但它不会在 运行 方法之后修改原始数组。我不确定它是否有问题或者它是否按预期工作。有什么建议吗?
@Override
public Object[] toArray() {
Object[] array = new Object[size];
ArrayList <TreeNode<E>> list = new ArrayList<>();
toArray(root, list);
for (int i = 0; i < size; i++ ){
array[i] = list.get(i);
}
return array;
}
protected void toArray(TreeNode<E> root, ArrayList <TreeNode<E>> array){
if (root == null) return;
toArray(root.left, array);
array.add(root);
toArray(root.right, array);
}
@Override
public <T> T[] toArray(T[] array) {
if (size > array.length){
array = (T[]) Array.newInstance(toArray()[0].getClass(), size);
}
if (size >= 0) System.arraycopy(toArray(), 0, array, 0, size);
return array;
}
Java 永远不会用其他东西替换方法参数。
这正是语言设计的工作方式。所以是的,它正在按预期工作,即使可能不像您预期的那样。
您基本上是被“array = ...”行搞糊涂了。最好用新名称创建一个数组,而不是尝试重用该名称。
这就是为什么许多人(包括我在内)强烈建议将所有方法参数声明为“final”的原因,因为这样编译器会提醒您(除此之外它几乎没有做任何事情)。
我编写了以下代码作为 BST 的实现。添加 toArray()
仅供参考。返回的数组工作得很好,但它不会在 运行 方法之后修改原始数组。我不确定它是否有问题或者它是否按预期工作。有什么建议吗?
@Override
public Object[] toArray() {
Object[] array = new Object[size];
ArrayList <TreeNode<E>> list = new ArrayList<>();
toArray(root, list);
for (int i = 0; i < size; i++ ){
array[i] = list.get(i);
}
return array;
}
protected void toArray(TreeNode<E> root, ArrayList <TreeNode<E>> array){
if (root == null) return;
toArray(root.left, array);
array.add(root);
toArray(root.right, array);
}
@Override
public <T> T[] toArray(T[] array) {
if (size > array.length){
array = (T[]) Array.newInstance(toArray()[0].getClass(), size);
}
if (size >= 0) System.arraycopy(toArray(), 0, array, 0, size);
return array;
}
Java 永远不会用其他东西替换方法参数。
这正是语言设计的工作方式。所以是的,它正在按预期工作,即使可能不像您预期的那样。
您基本上是被“array = ...”行搞糊涂了。最好用新名称创建一个数组,而不是尝试重用该名称。
这就是为什么许多人(包括我在内)强烈建议将所有方法参数声明为“final”的原因,因为这样编译器会提醒您(除此之外它几乎没有做任何事情)。