java中TreeSet類add時去重問題(與自己定義的Comparator有直接關係)
阿新 • • 發佈:2019-02-03
這個是我在百度問答裡面問的一個問題(直接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方法
-
比較器
-
class MyComparator2 implements Comparator{
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規則來排序而已呢!