这个是我在百度问答里面问的一个问题(直接copy过来的)
向TreeSet添加p1到p5后,输出发现p5没有加进去... 按我的理解来说,p5与p2虽然score属性值一样,但是它们是不同的对象,应该可以添加到TreeSet中啊 ------Person没有重写equals,hashcode这两个方法 求大神帮忙,本人菜鸟没想通... public class TreeSetTest2 { public static void main(String[] args) { Person p=new Person(45); Person p1=new Person(7); Person p2=new Person(85); Person p5=new Person(85);//score值与p2一样 Person p3=new Person(93); Person p4=new Person(44); TreeSet tree=new TreeSet(new MyComparator2());//这个比较器是根据Person类中的score字段比较的 tree.add(p); tree.add(p1); tree.add(p2); tree.add(p3); tree.add(p4); tree.add(p5); for(Iterator i=tree.iterator();i.hasNext();){ System.out.println(i.next()); } } } class Person{ private int score; public Person(int score) { this.score=score; } public int getScore(){ return this.score; } @Override public String toString() { return "score="+score; } }
你根据String 的值比较,同等的值只能插入一次,你看看你的比较器MyComparator2())
-
追问
-
我记得String是重写了equals的,只要字符串的字面值是一致就返回true; 但是Person并没有重写equals方法
-
比较器
-
public int compare(Object o1, Object o2) {
Person p=(Person)o1;
Person p2=(Person)o2;
if(p.getScore()>p2.getScore()){
return 1;
}else if(p.getScore()==p2.getScore()){
if(p.equals(p2)){
return 0;
}
return 1;
}else{
return -1;
}
//return p.getScore()-p2.getScore();
//这样也可以... 难道这里是只要返回正负数和零就行?
}
}
-
你把 p.getScore()==p2.getScore() 的return 0 表示只要 分数相等,就不插入,改为return 1试试 不行,就把 条件改为else if( p.getScore.equals(p2.getScore()))
-
追问
-
你好,改为return 1; p2和p5都可以加进去,但是把p1重复加到TreeSet里面也不去重了 于是我在return 1前面加了一条判断 if(p.equals(p2)){ return 0; } 哈哈... 这样就可以实现相同对象不会添加进去,但是相同的score不同对象可以加进去了 感谢,原来TreeSet的add去重还跟自己的Comparator有关系!
-
提问者评价
-
谢谢!
我以为它自己会实现判断加入对象是否重复,然后在对象不重复的前提下再根据我自己的comparator规则来排序而已呢!