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规则来排序而已呢!
   

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值