实施用途:2011年10月28日的数据结构实验练习 要做的:实现二进制搜索树
问题:K []返回方法preOrder(),inOrder()和postOrder()
问题详情: BST必须只有其根作为参数。上述方法已在我们的教授给出的界面中描述如下:
/**
* Returns an array of keys filled according
* to the pre-order traversing in a BST.
*/
public K[] preOrder();
public K[] order();
public K[] postOrder();
我可以使用以下代码实例化通用数组:
public K[] preOrder() {
if (root == null) { return null; }
ArrayList<K> list = new ArrayList<K>();
preOrderRecursive(root,list);
K[] toReturn = (K[]) Array.newInstance(this.getRoot().getKey().getClass(), list.size());
for (int i = 0; i < list.size(); i++) {
toReturn[i] = list.get(i);
}
return toReturn;
}
但是,当我使用我们教授提供的测试类测试方法时,我得到了一个nullPointerException,我认为是指BST的根,它曾经被实例化,但是已经被删除了在测试中,当它再次调用该方法时,该方法返回null,而不是测试所期望的空数组:
(...)
tree1 = new BSTImpl<Integer, Integer>();
for (int i = 0; i < SIZE; i++) {
tree1.insert(i, i);
}
tree1.remove(1);
tree1.remove(2);
tree1.remove(3);
tree1.remove(4);
assertArrayEquals(new Integer[]{},tree1.preOrder());
(...)
知道我无法更改返回类型和方法的参数,我该怎么做才能避免此异常?我可以以某种方式获取组件类型并使用它来实例化空数组(我是怎么做到的?)?
我们也欢迎任何改进我的代码的提示。
答案 0 :(得分:0)
问题是:你真的需要返回 Integer 数组吗? - 我不这么认为。
我认为assertArrayEquals()
不检查数组的组件类型,而只是比较包含的值。
根据您展示的代码,我会说由于类型擦除而无法实现其他任何目的。
因此,尝试在您的案例中返回Object[]
或任何超类型:
return new Object[0];
和
return list.toArray();
(需要未经检查的强制转换,但应该是o.k。)
编辑:
好的,<K extends Comparable>
?
在这种情况下使用:
return new Comparable[0];
和
return (Comparable[])list.toArray(new Comparable[]);