• 使用Comparable和Comparator排序


    一、排序规则

    Comparable和Comparator都是函数式接口,两者的使用大同小异。

    比较规则:

    1、Comparable下有个comparaTo(T o)方法,调用 a.comparaTo(b),如果是正数,则a比b大;如果是负数,则a比b小;如果是0,则相等。

    2、Comparator下有个compara(T o1,To2)方法,调用compara(T o1,To2),如果是正数,则a比b大;如果是负数,则a比b小;如果是0,则相等。

    同时,按照该排序逻辑,返回的数据默认有小到大排列。

    使用方式:

    1、Comparable被实体类继承,然后重写comparaTo方法。实体类实现Comparable,重写comparaTo方法。就可以被一些集合方法调用,实现排序。如TreeSet和TreeMap的自动排序(其实,前者调用后者)和Collections.sort()和Arrays.sort()。

    1、Comparator一般被当做参数传递给集合类,如List的sort方法。

    二、实现方式

    1、Comparable的排序

    实体类:

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Student implements Comparable<Student>{
        private String name;
        private Integer age;
    
        public int compareTo(Student o) {
            //先按name排序
            if(this.name.compareTo(o.getName())>0)
                return 1;
            if(this.name.compareTo(o.getName())<0)
                return -1;
    
            //再按age排序
            if(this.age > o.age)
                return 1;
            if(this.age < o.getAge())
                return -1;
            return 0;
        }
    }

    测试代码:

    import org.junit.Test;
    
    import java.util.*;
    
    public class AppTest {
    
        @Test
        public void test(){
            ArrayList<Student> list = new ArrayList();
            list.add(new Student("tom",22));
            list.add(new Student("tom",24));
            list.add(new Student("tom",2));
            System.out.println(list);
            Collections.sort(list);
            System.out.println(list);
    
        }
    }

    结果:

    [Student(name=tom, age=22), Student(name=tom, age=24), Student(name=tom, age=2)]
    [Student(name=tom, age=2), Student(name=tom, age=22), Student(name=tom, age=24)]

    2、Comparator的排序

    实体类:

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Student{
        private String name;
        private Integer age;
    }

    测试代码:

    import org.junit.Test;
    
    import java.util.*;
    
    public class AppTest {
    
        @Test
        public void test(){
            ArrayList<Student> list = new ArrayList();
            list.add(new Student("tom",22));
            list.add(new Student("tom",24));
            list.add(new Student("tom",2));
            System.out.println(list);
            list.sort((c1,c2) -> c1.getAge()-c2.getAge());//lambda表达式
            System.out.println(list);
    
        }
    }

    结果:

    [Student(name=tom, age=22), Student(name=tom, age=24), Student(name=tom, age=2)]
    [Student(name=tom, age=2), Student(name=tom, age=22), Student(name=tom, age=24)]

    注意:两个比较对象的顺序写错会直接导致排序方式变化,由正序变成反序。

    就算这个世道烂成一堆粪坑,那也不是你吃屎的理由
  • 相关阅读:
    基于PI的Webservice发布实例
    SM30 表格维护生成器
    各种财务凭证的冲销
    SAP后台作业记录操作
    特性,批次特性建立的BAPI函數
    Windows 上 Nginx 路径的陷阱
    BitKeeper 和 Git
    Javascript 正则验证带 + 号的邮箱地址
    FastAdmin 开发第三天:认识目录
    PHP 中的对象传递
  • 原文地址:https://www.cnblogs.com/whalesea/p/12934786.html
Copyright © 2020-2023  润新知