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)可以找到呢?
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)可以找到呢?
解决方案 »
- script调用FLASH
- 说出Servlet的生命周期,并说出Servlet和CGI的区别
- 一个按钮事件的问题,求人帮忙
- org.apache.myfaces.custom.fileupload.UploadedFile获得文件路径名(急求)
- 关于异常的问题
- 用java如何写telnet的小程序?
- 求高手点拨:“Java GUI 程序的"开机自启动"和"后台运行"”的细节功能实现代码书写的组织。
- 清华的ftp,谁知道!
- 命令行环境下,一定要在进入源代码文件的目录后才能使用javac吗?
- java重要信息了解!
- java File的 renameTo()问题
- 朋友们,帮帮我!如何控制URL的连接时间
不然你觉得你重写compareTo是为了什么?
想认为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;
}
}
我定义过这两个方法,效果是一样的!我重写了上面代码: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没有变化!你运行看看!!~~~~
{
if (obj instanceof TreeNode)
{
if (((TreeNode) obj).getDelay() == this.delay &&((TreeNode) obj).getId() == this.id )
{
return true;
}
return false;
}
return false;
}
* 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
当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,逐条分析
我仍旧希望Id用来决定节点的唯一性,delay用来决定节点的顺序!
可是,我又希望用节点进行查找,比如new TreeNode(0,id)进行查找!因为查找节点前,我只知道节点编号!有好的解决办法吗?