0

我正在尝试创建一个方法“ headSet”,该方法创建并返回一个新TreeSetset值,这些值是被调用中的所有值TreeSet,都小于参数元素“之前”。

我可以获得所有正确的遍历,并且在 Net Beans 中进行了调试,新集合确实包含在引发异常之前它应该包含的所有值。我只是不知道为什么当我打电话时headSet(n.right,before,set)..特别是n.right..它坏了。如果它不坏,它会工作得很好。

编辑:当我用问题线 , 运行程序时,主递归助手中的headSet(n.right,before,set)所有 3 个headSet()方法调用都在堆栈跟踪中。当我注释掉该行时,除了不正确的树遍历之外没有其他问题。

这是触发递归助手的主要公共调用方法:

public SortedSet<E> headSet(E before){
  SortedSet<E> set = new SearchTreeSet<E>();
  headSet(root, before, set);
  return set;
}

其中 root 是被调用的第一个节点TreeSet

主要的递归助手:

private void headSet(Node n, E before, SortedSet<E> set) {
  int comp = myCompare(n.data, before);

  if (comp < 0){ //n.data is less than before
    // add node n to the new set
    if (n.data != null) { //It shouldn't be null but I just wanted to eliminate NPE sources
        set.add(n.data);
    }
    // all nodes to the left are added automatically with a separate recursive function
    headSet(n.left, set);

    // test nodes to the right

    //////////////The next statement forces a null pointer exception ////////
    headSet(n.right, before, set);
  }
  // n.data is greater than or equal to 'before'
  else {

        // move to the left and retest
        headSet(n.left, before, set);
  }
}

第二个递归函数不比较,它只是将所有节点分支添加到新的排序树集'set'

private void headSet(Node n, SortedSet<E> set){
  if (n.data != null){ // 'if statement' is to eliminate NPE sources, it normally shouldn't be null
    set.add(n.data);
  }
  if (n.left != null) { headSet(n.left, set);  }
  if (n.right != null) { headSet(n.right, set); }
}

已解决:谢谢大家!做到了..我不敢相信我没有看到它。

这是我为解决问题所做的更改:

if (n.left != null) {
   headSet(n.left, set);
}

if (n.right != null) {
   headSet(n.right, before, set);
}

并且

if (n.right != null) {
   headSet(n.right, before, set);
}
4

1 回答 1

0

首先,我认为您不会使用 SortedSet 实现您的计划。因为当您将对象添加到 SortedSet 时,它会根据您添加到其中的对象定义的 compareTo 方法对对象的内部顺序进行排序。现在,在您的情况下,最简单的事情是实现 Comparable to n.data 类。当你这样做时,你可以使用你在 myCompare 方法中定义的逻辑。现在以任意顺序将 n.data 添加到 SortedSet,SortedSet 将使用其自然顺序组织它们。如果您真的想以编程方式维护订单,请使用 List。现在假设您摆脱了 NPE,然后您想打印存储在 Set 中的 n.data 并想要验证您的排序算法是否有效,您不能这样做,因为 set 将根据其自然返回对象列表排序顺序。

于 2013-10-22T02:50:58.473 回答