天天看点

java comparator接口理解怎么理解这个接口的行为怎么实现多重排序

在工作中,碰到很多开发人员对于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. 排序默认是按照升序排序
  2. 如果返回-1,就认为01 小于02,(注意01和02的顺序)
  3. 如果返回0,认为两个相等
  4. 如果返回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;
        }
    }
}