• Comparable和Comparator的比较用法


    一、Comparable的用法

          当对java中的某个类的对象要进行排序比较,有两种实现方法,第一种就是类实现Comparable接口,重写compareTo方法,编写排序的逻辑。下面介绍这种方法:

          举例:

          

     1 package com.guolele.web.util;
     2 
     3 /**
     4  * Created by luotong 2016/8/22.
     5  */
     6 public class Person implements Comparable<Person>{
     7     private String name;
     8     private int age;
     9     private int sal;
    10 
    11     public Person() {
    12     }
    13 
    14     public Person(int age,String name,int sal) {
    15         this.age = age;
    16         this.name = name;
    17         this.sal = sal;
    18     }
    19 
    20     public String getName() {
    21         return name;
    22     }
    23 
    24     public void setName(String name) {
    25         this.name = name;
    26     }
    27 
    28     public int getAge() {
    29         return age;
    30     }
    31 
    32     public void setAge(int age) {
    33         this.age = age;
    34     }
    35 
    36     public int getSal() {
    37         return sal;
    38     }
    39 
    40     public void setSal(int sal) {
    41         this.sal = sal;
    42     }
    43 
    44     @Override
    45     public int compareTo(Person p) {
    46         // 先按年龄排,再按姓名排,再按工资排
    47         int com = Integer.valueOf(this.age).compareTo(Integer.valueOf(p.age));
    48         if (com != 0) {
    49             return com;
    50         }
    51         com = this.name.compareTo(p.name);
    52         if (com != 0) {
    53             return com;
    54         }
    55         return Integer.compare(this.sal,p.sal);
    56     }
    57 }

    二、自定义比较器,实现Comparator接口

          自定义比较器更加的灵活,实现Comparator接口要重写compare方法

          举例:

     1 package com.guolele.web.util;
     2 
     3 import java.util.Comparator;
     4 
     5 /**
     6  * Created by luotong on 2016/8/22.
     7  *
     8  * 自定义比较器
     9  */
    10 public class PersionComparator implements Comparator<Person>{
    11 
    12     @Override
    13     public int compare(Person p1, Person p2) {
    14         // 先按年龄排,再按姓名排,再按工资排
    15         int com = Integer.valueOf(p1.getAge()).compareTo(Integer.valueOf(p2.getAge()));
    16         if (com != 0) {
    17             return com;
    18         }
    19         com = p1.getName().compareTo(p2.getName());
    20         if (com != 0) {
    21             return com;
    22         }
    23         return Integer.compare(p1.getSal(),p2.getSal());
    24     }
    25 }

    三、利用Guava中的ComparisonChain抽象类实现多个属性排序

         上面的两种方式代码更加的琐碎,容易搞乱,也不容易调试,而使用Guava的ComparisonChain抽象类的Fluent风格可读性更高,发生错误编码的几率更小。

          举例:

          

    package com.guolele.web.util;
    
    import com.google.common.collect.ComparisonChain;
    
    import java.util.Comparator;
    
    /**
     * Created by luotong on 2016/8/22.
     *
     * 自定义比较器,利用Guava中的ComparisonChain抽象类实现
     */
    public class PersionComparator implements Comparator<Person>{
    
        @Override
        public int compare(Person p1, Person p2) {
            // 先按年龄排,再按姓名排,再按工资排
            return ComparisonChain.start()
                    .compare(p1.getAge(), p2.getAge())
                    .compare(p1.getName(),p2.getName())
                    .compare(p1.getSal(),p2.getSal())
                    .result();
        }
    }

    *** ComparisonChain对多个属性同时排序只能同时升序或者同时降序,如果要灵活排序建议用初始的方法,比如:方法二;

  • 相关阅读:
    微服务怎么限流?算法+框架+实战!
    Maven 架构选型,单模块还是多模块?
    Java 几行代码提取图片文字,过个厉害了。。
    面试官:SOA 和微服务的区别?这回终于搞清楚了!
    别再纠结线程池大小了,没有固定公式的!终于有人说清楚了。。
    MySQL 8.0 可以操作 JSON 了,牛逼。。。
    C#中判断一个类是否实现了某interface
    所有各数据库或文件的连接串定义CHM文件.
    这两天终于把火箭动力稍微搞清楚了点
    事件查看器中总是出现 sqlserveragent的错误
  • 原文地址:https://www.cnblogs.com/tongluo/p/5796647.html
Copyright © 2020-2023  润新知