/*
定义一个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不同了。谢谢给我点提示
定义一个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不同了。谢谢给我点提示
TreeSet是根据compareTo();来区别两个对象是相同还是不同。
HashSet用hashCode()和equals()来区分两个对象是相同还是不同。填装好hashSet之后,用Collections.sort()来排序。
你可以在Collections.sort()中指定Comparator,也可以让hashSet中的对象实现Comparable接口。
将对象添加到setTree之后,在对这个setTree按照salary排序即可了
HashSet怎么实现Comparable接口???HashSet本来就是无序的,你怎么实现有序啊?
//先考虑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;
}
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,进行排序
这个能实现,另外请教下能在TreeSet里实现么?不用HashSet啊,谢谢
TreeSet必须要实现Comparable接口,并且必须与equals保持一致。
例如:
t1: a 33 5000
t2: b 33 5000
这种情况,equals返回的应该是false,但Comparable返回的是0,也就是相等,这样不一致。违反了规定。
所以用TreeSet不能实现。lz看一下TreeSet的API,上面讲了需要遵循的约束