zoukankan      html  css  js  c++  java
  • Comparable与Comparator

    Comparable

    comparable是java的接口,该接口对实现它的每个类的对象进行整体排序。 compareTo 方法被称为它的比较方法。实现此接口的对象列表或数组可以通过 Collections.sort或 Arrays.sort进行自动排序,而无需指定比较器。

    Comparator

    comparator也是java的接口,对任意类型集合对象进行整体排序,排序时将此接口的实现传递给Collections.sort方法或者Arrays.sort方法排序。

      两者的作用类似,并没有什么区别,comparator更像是对comparable的补充。比如我们定义了一个Grade类(学生成绩),该类包括了学生id、语文成绩与数学成绩,此时Grade实现Comparable接口,

    重写compareTo()方法,实现按语文成绩排序。但如果需要用到按数学成绩排序的序列时,可以使用Comparator重新定义排序规则,而不需要去修改原来的排序规则。以下为代码实现:

    public class Grade implements Comparable<Grade>{
        private String stuId;
        private int chinese;
        private int math;
    
        public String getStuId() {
            return stuId;
        }
    
        public void setStuId(String stuId) {
            this.stuId = stuId;
        }
    
        public int getChinese() {
            return chinese;
        }
    
        public void setChinese(int chinese) {
            this.chinese = chinese;
        }
    
        public int getMath() {
            return math;
        }
    
        public void setMath(int math) {
            this.math = math;
        }
    
    
        @Override
        public int compareTo(Grade o) {
            return this.chinese-o.chinese;
        }
    }
    public class Test {
        public static void main(String[] args) {
            Grade grade = new Grade();
            grade.setStuId("12");
            grade.setChinese(23);
            grade.setMath(34);
    
            Grade grade1 = new Grade();
            grade1.setStuId("13");
            grade1.setChinese(25);
            grade1.setMath(54);
    
            Grade grade3 = new Grade();
            grade3.setStuId("14");
            grade3.setChinese(12);
            grade3.setMath(59);
            List<Grade> list = new ArrayList<>();
            list.add(grade1);
            list.add(grade);
            list.add(grade3);
            System.out.println("按語文排序:");
            Collections.sort(list);
            for (Grade grade2 : list) {
                System.out.println(grade2.getStuId()+" "+grade2.getChinese()+" "+grade2.getMath());
            }
    
            System.out.println("按數學排序:");
            Collections.sort(list,(x,y)->{return x.getMath()-y.getMath();});
    /*   Collections.sort(list, new Comparator<Grade>() {
    @Override
    public int compare(Grade o1, Grade o2) {
    return o1.getMath()-o2.getMath();
    }
    });*/
    for (Grade grade2 : list) { System.out.println(grade2.getStuId()+" "+grade2.getChinese()+" "+grade2.getMath()); } } }

    执行结果:

    重写compare方法,采用lambda表达式实现,比匿名内部类实现语法上更简单明了。

  • 相关阅读:
    iOS js交互
    崩溃!UIAlertController 引起的崩溃
    跳转到AppStore下载app
    installshield basic msi 更新时覆盖不了上一个版本文件解决方案1
    用ILMerge.exe合并dll
    获取某几个分类下的前N条数据 mssql语句
    计算网络文件的大小
    英语 2018-12-04 2法国燃料涨价抗议活动
    英语2018-12-04
    从一个故事说起,谈谈企业应用架构的演变史
  • 原文地址:https://www.cnblogs.com/menbo/p/11369630.html
Copyright © 2011-2022 走看看