/* 
    定义一个Teacher类,包含3个属性:name,age,salary。
    并且定义若两个对象的name和age都相同,则认为这
    两个对象相等。要求该Teacher类对象能比较大小,
    按照age的大小来排序,如果age相同的则按salary大
    小来排。最后,生成一些Teacher对象,用TreeSet验
    证以上程序的正确性。
*/我写的代码
         @Override
public int compareTo(Teacher tea){
if(this.getAge()<tea.getAge()){
return -1;
}
if(this.getAge()>tea.getAge()){
return 1;
}
if(this.getSalary()<tea.getSalary()){
return -1;
}
if(this.getSalary()>tea.getSalary()){
return 1;
}
if(this.getName().compareTo(tea.getName())<0){
return -1;
}
if(this.getName().compareTo(tea.getName())>0){
return 1;
}
return 0; 
}
         Teacher tea1=new Teacher("张1",23,7000f);
Teacher tea2=new Teacher("张2",28,5000f);
Teacher tea4=new Teacher("张1",23,5000f);
Teacher tea3=new Teacher("张3",25,8000f);
Teacher tea5=new Teacher("张5",25,6000f);
         Set<Teacher> setTree=new TreeSet<Teacher>();
setTree.add(tea3);
setTree.add(tea4);
setTree.add(tea1);
setTree.add(tea5);
setTree.add(tea2);这有个我想不明白的tea1,tea2,tea3,tea4,tea5都添加进去了-------是由于我在compareTo里比较了Salary,大小但是我想要的结果是,name和age相同时,TreeSet就不能添加相同的了,但是我想要Salary的排序,如果我在compareTo里添加Salary进去。就出现了name和age相同,Salary不同,TreeSet也可以添加进去。一句话:我想保住tea不同,Salary排序功能就实现不了。如果保住Salary排序功能实现,就不能保证tea不同了。谢谢给我点提示

解决方案 »

  1.   

    那就不要用TreeSet了,改用HashSet。
    TreeSet是根据compareTo();来区别两个对象是相同还是不同。
    HashSet用hashCode()和equals()来区分两个对象是相同还是不同。填装好hashSet之后,用Collections.sort()来排序。
    你可以在Collections.sort()中指定Comparator,也可以让hashSet中的对象实现Comparable接口。
      

  2.   

    楼主在public int compareTo(Teacher tea)先不要对Salary进行判断,只判断name和age
    将对象添加到setTree之后,在对这个setTree按照salary排序即可了
      

  3.   

    将对象添加到setTree之后,你怎么再去对里面的salary排序????因为你的compareTo重写了,你怎么去排序salary???
      

  4.   


    HashSet怎么实现Comparable接口???HashSet本来就是无序的,你怎么实现有序啊?
      

  5.   

    我觉得还是可以直接用TreeSet的,只要在实现Comparable时注意一下。public int compareTo(Teacher t){
        //先考虑equals的情况
        if(t.name.equals(name)&&t.age==age)//如果name
            return 0;
        //然后不相等,就会有顺序,这时先跟据age排序,再根据salary排
        if(t.age!=age)
            return age-t.age;
        else
            return salary-t.salary;
    }
      

  6.   

    哦,上面的方法貌似不行,因为排除掉了当age和salary相等的时候
      

  7.   

    可以用HashSet和TreeSet来完成,HashSet用来去掉重复的元素(需要重写equals),TreeSet用来排序(实现Comparable接口)public boolean equals(Object obj){
        if(obj==this)
            return true;
        if(!(obj instanceof Teacher))
            return false;
        Teacher t=(Teacher)obj;
        return t.name.equals(name)&&t.age==age
    }public int compareTo(Teacher t){
        if(t.age!=age)
            return age-t.age;
        else
            return salary-t.salary;
    }
    分两步:
    1.先把所有元素放入HashSet中,去掉重复元素
    2.把HashSet中的元素放入TreeSet,进行排序
      

  8.   


    这个能实现,另外请教下能在TreeSet里实现么?不用HashSet啊,谢谢
      

  9.   


    TreeSet必须要实现Comparable接口,并且必须与equals保持一致。
    例如:
    t1: a 33 5000
    t2:  b 33 5000
    这种情况,equals返回的应该是false,但Comparable返回的是0,也就是相等,这样不一致。违反了规定。
    所以用TreeSet不能实现。lz看一下TreeSet的API,上面讲了需要遵循的约束