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)可以找到呢?

解决方案 »

  1.   

    因为你重写了compareTo方法。
    不然你觉得你重写compareTo是为了什么?
      

  2.   

    2楼:实现Comparable接口,必须实现接口方法!
      

  3.   

    我实现compareTo方法的目的是为了使得TreeNode具有可比较性!
    想认为Id相同的对象,视为同一对象,然后再按照delay的大小参与排序!
    只是结果中new TreeNode(0, 1)。符合预期,可是new TreeNode(0, 5)却找不到!
    大家可以帮忙运行下,你机器是不是这样的!~~~~
    不知道问题出在哪里????
    @Override
    public int compareTo(TreeNode o) {
        if(this.id == o.getId()){
            return 0;
        }else{
            if(this.delay > o.getDelay()){
                return 1;
            } else{
                return -1;
            }
        }
      

  4.   

    嗯,equals、 hasCode方法重写了
      

  5.   

    equals、 hasCode方法似乎不需要重写!HashSet集合为了保证唯一性,会调用这两个方法!TreeSet好像不会使用这两个方法!
    我定义过这两个方法,效果是一样的!我重写了上面代码:package com.xiuxiu.physical;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 int hashCode() {
    System.out.println("run hashCode");
    return ((Integer)id).hashCode();
    }
    @Override
    public boolean equals(Object obj) {
    System.out.println("run equals");
    return true;
    }
    @Override
    public String toString() {
    return "TreeNode [delay=" + delay + ", id=" + id + "]";
    }

    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没有变化!你运行看看!!~~~~
      

  6.   

    你这叫重写equals? --! public boolean equals(Object obj)
    {
    if (obj instanceof TreeNode)
    {
    if (((TreeNode) obj).getDelay() == this.delay &&((TreeNode) obj).getId() == this.id )
    {
    return true;
    }
    return false;
    }
    return false;
    }
      

  7.   

    contains :Returns <tt>true</tt> if this map contains a mapping for the specified
         * key.  More formally, returns <tt>true</tt> if and only if
         * this map contains a mapping for a key <tt>k</tt> such that
         * <tt>(key==null ? k==null : key.equals(k))</tt>.  
    使用的是对象的equals
      

  8.   

    我又看了下。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,逐条分析
      

  9.   


    我仍旧希望Id用来决定节点的唯一性,delay用来决定节点的顺序!
    可是,我又希望用节点进行查找,比如new TreeNode(0,id)进行查找!因为查找节点前,我只知道节点编号!有好的解决办法吗?