【问题标题】:Binary Search Tree's K[] preOrder() method: about the generic return二叉搜索树的 K[] preOrder() 方法:关于泛型返回
【发布时间】:2011-10-30 20:33:42
【问题描述】:

实施使用: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());

    (...)

知道我不能改变返回类型和方法的参数,我能做些什么来避免这个异常?我可以以某种方式获取组件类型并使用它来实例化空数组(我是怎么做到的?)?

也欢迎任何改进我的代码的提示。

【问题讨论】:

  • 您在创建数组时在newInstance 表达式中使用了array.size,但不确定array 指的是什么。然后继续使用 list.size() 填充K[]。你确定array.size 实际上有非零长度吗?
  • 这是一个简单的错误:我使用变量名称“array”来命名列表,当我在这里发布时,我将所有变量重命名为一个不言自明的名称,但忘记在那里重命名.表达式“array.size()”指的是列表,而不是数组。

标签: java generics data-structures binary-search-tree


【解决方案1】:

问题是:您真的需要返回一个整数数组吗? - 我不这么认为。

我假设assertArrayEquals() 确实不检查数组的组件类型,而只是比较包含的值。

使用您显示的代码,我想说由于类型擦除,其他任何事情都是不可能的。

因此,请尝试返回 Object[] 或适用于您的情况的任何超类型:

return new Object[0];

和

return list.toArray();

(需要未经检查的强制转换,但这应该没问题)

编辑:

好的,那么&lt;K extends Comparable&gt;?
在这种情况下使用:

return new Comparable[0];

和

return (Comparable[])list.toArray(new Comparable[]);

【讨论】:

  • 我想过,但没那么简单。该方法不能返回一个对象,它必须返回一个可比较的对象。
  • 数组本身是从不可比较的,包含的值可能是。在您的情况下,它们 是 可比较的,因为您将 Integer 对象放入数组中。你试过我的方法吗? - 正如我试图解释的那样:当然,您可以使用 new Integer[0]; 或任何符合预期(超级)类型的东西。
  • 我试过了,但没有用。如果它返回一个Object,它会抛出一个ClassCastException,因为该类会比较键以找出插入新节点的位置,因此它需要是一个实现Comparable接口的类。按照我的方式做,它不会通过测试,因为当根为空时,它返回一个空数组而不是元素类的数组,正如测试所要求的那样。请记住,我无法更改方法的返回值、参数或测试。我只是希望有某种方法可以告诉代码我想要它不是一个空数组,而是一个空数组,无论是树的键的类。
猜你喜欢
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多