Comparator接口漫谈

废话不多说

怎么判断升序和降序

//伪代码
public int compare(Object o1, Object o2) {
return o1 -o2;
}

这么说吧,Comparator接口的compare方法是由一个默认是《升序》的。

Collections类始终认为

  1. 如果返回负值,o1比o2小
  2. 如果返回正值,o1比o2大

Collections类会把它认为小的值放到前面,它认为大的值放到后面。

  1. 如果我们需要升序排列

    return o1-o2 

    1.1. 如果返回负值,o1真实值的比o2小,Collections也是这么认为的,所以Collections把o1排在前面
    1.2. 如果返回正值,o1真实值的比o2大,Collections也是这么认为的,所以Collections把o1放在后面

  2. 如果我们需要降序排列

    return o2-o1 

    如果返回负值,o1真实值比o2大,Collections却认为o1比o2小,所以Collections把o1排在前面
    如果返回正值,o1真实值比o2小,Collections却认为o1比o2大,所以Collections把o1排在后面

这样不就达到我们需要的降序的效果了吗!!

怎么实现多重排序

一开始自己没想,就想google看看有没有现成的,结果google出来质量堪忧。
于是就想着自己写写看,那直接看代码好了。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
/**
* User:ThinerZQ
* Email:thinerzq@gmail.com
* 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(10,1000,4));
persons.add(new Person(1,1020,5));
persons.add(new Person(1,1020,4));
persons.add(new Person(13,1100,2));
persons.add(new Person(1,1020,5));
for (int i = 0; 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 = 0; 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;
}
}
}
坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章

Fork me on GitHub