在工作中,碰到很多开发人员对于camparator接口理解都不深,每次做排序都要写一个main函数试一下才知道就行排序对了没。
怎么理解这个接口的行为
接口注释原文:
Compares its two arguments for order. Returns a negative integer,
* zero, or a positive integer as the first argument is less than, equal
* to, or greater than the second.<p>
comparator接口(01,02)->{}
- 排序默认是按照升序排序
- 如果返回-1,就认为01 小于02,(注意01和02的顺序)
- 如果返回0,认为两个相等
- 如果返回1,就认为01大于02,(注意01和02的顺序)
这个方法有一个需要特别注意的点,一个是对于(01,02),(02,01)方法的行为应该保持一致。 改方法内部使用的是归并排序
怎么实现多重排序
一开始自己没想,就想google看看有没有现成的,结果google出来质量堪忧。
于是就想着自己写写看,那直接看代码好了。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
/**
* User:ThinerZQ
* Email:[email protected]
* Date:2016/9/23 14:37
* Project:Test
* Package:PACKAGE_NAME
*/
public class TestCompartor {
public static void main(String[] args) {
ArrayList<Person> persons = new ArrayList<Person>();
persons.add(new Person(,,));
persons.add(new Person(,,));
persons.add(new Person(,,));
persons.add(new Person(,,));
persons.add(new Person(,,));
for (int i = ; i <persons.size(); i++) {
System.out.println(persons.get(i));
}
System.out.println();
Collections.sort(persons, new Comparator<Person>() {
//级别,年份,薪资排序降序,
public int compare(Person o1, Person o2) {
//只有级别相等的时候才用去判断薪水
if (o1.level == o2.level){
//只有薪水相等的时候采用去判断年份
if (o1.salary == o2.salary){
//最后按照年份判断了。
return o2.years - o1.years;
}else{
//薪水不相等就按照薪水判断嘛
return o2.salary - o1.salary;
}
}else{
//级别不相等就按照级别判断嘛
return o2.level - o1.level;
}
}
});
for (int i = ; i <persons.size(); i++) {
System.out.println(persons.get(i));
}
}
static class Person{
public int level; //级别
public int salary; //工资
public int years; //入职年数
@Override
public String toString() {
return "Person{" +
"level=" + level +
", salary=" + salary +
", years=" + years +
'}';
}
public Person(int level, int salary, int years) {
this.level = level;
this.salary = salary;
this.years = years;
}
}
}