1. 程式人生 > >java中TreeSet類add時去重問題(與自己定義的Comparator有直接關係)

java中TreeSet類add時去重問題(與自己定義的Comparator有直接關係)

這個是我在百度問答裡面問的一個問題(直接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規則來排序而已呢!