日期:2014-05-20  浏览次数:20721 次

TreeSet的一个很奇怪的输出想象?不是很明白,哪位能解释一下吗?
import java.util.TreeSet;


public class TreeNode implements Comparable<TreeNode>{
private double delay; // 剩余时间片 (key)
private int id; // 分子编号

public double getDelay() {
return delay;
}
public void setDelay(double delay) {
this.delay = delay;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public TreeNode(double delay, int id) {
super();
this.delay = delay;
this.id = id;
}

@Override
public String toString() {
return "TreeNode [delay=" + delay + ", id=" + id + "]";
}
@Override
public int compareTo(TreeNode o) {
if(this.id == o.getId()){
return 0;
}else{
if(this.delay > o.getDelay()){
return 1;
} else{
return -1;
}
}

}

public static void main(String[] args) {
TreeSet<TreeNode> ts = new TreeSet<TreeNode>();
ts.add(new TreeNode(1.1, 1));
ts.add(new TreeNode(1.2, 2));
ts.add(new TreeNode(1.3, 3));
ts.add(new TreeNode(1.4, 4));
ts.add(new TreeNode(1.5, 5));
ts.add(new TreeNode(1.6, 6));

System.out.println();

System.out.println(ts.contains(new TreeNode(0, 1)));
System.out.println(ts.contains(new TreeNode(1.2, 2)));
System.out.println(ts.contains(new TreeNode(0, 3)));
System.out.println(ts.contains(new TreeNode(1.4, 4)));
System.out.println(ts.contains(new TreeNode(0, 5)));
System.out.println(ts.contains(new TreeNode(1.6, 6)));

}
}

上面的代码运行的结果是:

true
true
false
true
false
true

为什么:new TreeNode(0, 5)的输出时false,而new TreeNode(0, 1)可以找到呢?

------解决方案--------------------
我又看了下。treeSet底层实际使用的容器就是 TreeMap,TreeMap使用红黑树排序。http://www.ibm.com/developerworks/cn/java/j-lo-tree/index.html 上面的程序最后的根节点为TreeNode(1.2, 2)。
当TreeNode(0, 1)和根节点比较时,你用的是先比较id大小。显然id不等于2。然后再和比较delay,小于1.2。所以继续和根节点左边的entry比较,即TreeNode(1.1, 1)。id相同所以返回true。
当TreeNode(0, 5)和根节点比较时。id也相等2。比较delay,小于。所以继续和根节点左边的entry比较,即TreeNode(1.1, 1)。id不相同,delay小于,返回-1,即false。
同理如果TreeNode(0, 2)也返回true。。。因为返回1

不好意思上面几条是我看错了。。。我靠,一个id只能回3次,注册个马甲来~
LZ可以用debug,逐条分析


------解决方案--------------------
我又看了下。treeSet底层实际使用的容器就是 TreeMap,TreeMap使用红黑树排序。http://www.ibm.com/developerworks/cn/java/j-lo-tree/index.html 上面的程序最后的根节点为TreeNode(1.2, 2)。
当TreeNode(0, 1)和根节点比较时,你用的是先比较id大小。显然id不等于2。然后再和比较delay,小于1.2。所以继续和根节点左边的entry比较,即TreeNode(1.1, 1)。id相同所以返回true。
当TreeNode(0, 5)和根节点比较时。id也相等2。比较delay,小于。所以继续和根节点左边的entry比较,即TreeNode(1.1, 1)。id不相同,delay小于,返回-1,即false。
同理如果TreeNode(0, 2)也返回true。。。因为返回1

不好意思上面几条是我看错了。。。我靠,一个id只能回3次,注册个马甲来~
LZ可以用debug,逐条分析