o1 = o2,返回0,按当前顺序即可,或者比较其他参数。
二、实际用例
Person 是定义的需要排序的对象,包括年龄和姓名两个字段。
class Person implementsComparable{privateString name;private intage;//重写toString()方法,输出对象时输出格式为:name:age
@OverridepublicString toString() {return name+ ":" +age;
}publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}public intgetAge() {returnage;
}public void setAge(intage) {this.age =age;
}public Person(String name, intage) {super();this.name =name;this.age =age;
}//Person自带的排序规则
@Overridepublic intcompareTo(Object o) {
Person p=(Person) o;//根据年龄进行排序
int temp = this.age -p.age;return temp == 0 ? this.name.compareTo(p.name):temp;
}
}
View Code
排序规则一:定义升序排序器,先按年龄升序,再按姓名首字母升序。
比如 o1对象为 (zhangshan:20) ,o2 对象为 (wangwu:21) ,默认排序 [o1, o2],由于 o1.age < o2.age,比较结果返回负数,false,表示不需要调整规则,按年龄升序排序,最终排序结果为 [zhangshan:20, wangwu:21]。
比如 o1 对象为 (zhangshan:20) ,o2对象为 (lisi:20),默认排序 [o1,o2],由于 o1.age = o2.age,比较结果为0,不按年龄排序,进一步比较name,由于 o1.name > o2.name,返回 true,调整排序规则,即按字母升序排序,最终排序结果为 [lisi:20, zhangshan:20]。
/**
* 自定义升序排序器
* 升序:先按年龄升序,再按姓名首字母升序
*/
class ComparatorByAge implementsComparator {
// 根据年龄排序
@Override
public intcompare(Object o1, Object o2) {
Person p1 =(Person) o1;
Person p2 =(Person) o2;
int tmp = p1.getAge() -p2.getAge();
return tmp == 0 ?p1.getName().compareTo(p2.getName()) : tmp;
}
}
排序规则二:定义降序排序器,先按年龄降序,再按姓名首字母降序。和升序的唯一区别就是返回结果的参数前添加了一个负号。
/**
* 自定义降序排序器
* 降序:先按年龄降序,再按姓名首字母降序
*/
class ComparatorByAge2 implementsComparator {
// 根据年龄排序
@Override
public intcompare(Object o1, Object o2) {
Person p1 =(Person) o1;
Person p2 =(Person) o2;
int tmp = p1.getAge() -p2.getAge();
return tmp == 0 ? -(p1.getName().compareTo(p2.getName())) : -tmp;
}
}
排序 main() 方法,查看两种排序器的排序结果。
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet ts = new TreeSet(new ComparatorByAge());
ts.add(new Person("zhangsan", 20));
ts.add(new Person("wangwu", 21));
ts.add(new Person("lisi", 20));
ts.add(new Person("zhouqi", 29));
ts.add(new Person("zhaoliu", 28));
for (Person person : ts) {
System.out.println(person);
}
/* 结果输出
lisi:20
zhangsan:20
wangwu:21
zhaoliu:28
zhouqi:29
*/
ts = new TreeSet(new ComparatorByAge2());
ts.add(new Person("zhangsan", 20));
ts.add(new Person("wangwu", 21));
ts.add(new Person("lisi", 20));
ts.add(new Person("zhouqi", 29));
ts.add(new Person("zhaoliu", 28));
for (Person person : ts) {
System.out.println(person);
}
/* 结果输出
zhouqi:29
zhaoliu:28
wangwu:21
zhangsan:20
lisi:20
*/
}
}