我正在尝试创建一个方法“headSet
”,该方法会创建并返回一个新的TreeSet
,set
值,这些值都是被调用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);
}
答案 0 :(得分:0)
首先,我认为您不会使用SortedSet实现您的计划。 因为当您向SortedSet添加对象时,它会根据您添加到其中的对象定义的compareTo方法对对象的内部顺序进行排序。现在,在您的情况下,最简单的方法是将Comparable实现为n.data类。当你这样做时,你可以使用你在myCompare方法中定义的逻辑。现在以任何顺序将n.data添加到SortedSet,SortedSet将使用其自然顺序组织它们。如果您确实想以编程方式维护订单,请使用List。现在让我们说你摆脱了NPE,然后你想要打印存储在Set中的n.data并想要验证你的排序算法是否有效,你不能这样做,因为set会根据它的自然返回对象列表排序顺序。