• Java基础--比较器Comparator


    Comparable接口和Comparator接口都是用来定义集合中的排序的,只是Comparable是在集合内部定义排序的实现,Comparator是在集合外部排序的实现。

    Comparable 的在java.util中
    Comparator 的在java.lang中

    Comparable接口的实现表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
    Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
    1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象或类本身
    2、对象之间可以使用多种排序方法

    最好将equals方法也实现了,并且与compare方法对应。

    一个例子:

    -------------------------

    package demos;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    import java.util.Set;
    import java.util.TreeSet;
    
    class Student {
        int age;
        String name;
        Student(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "[" + age + " , " + name + "]";
        }
    }
    
    class myComparator implements Comparator<Student> {
        @Override
        public int compare(Student o1, Student o2) {
            if (o1.age != o2.age) {
                return o1.age - o2.age;
            }
            if (!o1.name.equals(o2.name)) {
                return o1.name.compareTo(o2.name);
            }
            return 0;
        }
    }
    
    class Teacher implements Comparable<Teacher> {
        private int age;
        private String name;
        Teacher(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        @Override
        public int compareTo(Teacher o) {
            if (age != o.age) {
                return age - o.age;
            }
            if (!name.equals(o.name)) {
                return name.compareTo(o.name);
            }
            return 0;
        }
        
        @Override
        public String toString() {
            return "[" + age + " , " + name + "]";
        }
    }
    
    public class ComparaTest {
        public static void main(String[] args) {
            Student s1 = new Student(10, "5li");
            Student s2 = new Student(10, "4wang");
            Student s3 = new Student(16, "3zh");
            Student s4 = new Student(16, "2omg");
            Student s5 = new Student(19, "1hehe");
    
            // 比较器是必须的,否则抛异常class cannot be cast to java.lang.Comparable
            Set set = new TreeSet(new myComparator());
            set.add(s5);
            set.add(s4);
            set.add(s3);
            set.add(s2);
            set.add(s1);
            System.out.println(set);
    
            Teacher t1 = new Teacher(10, "5li");
            Teacher t2 = new Teacher(10, "4wang");
            Teacher t3 = new Teacher(16, "3zh");
            Teacher t4 = new Teacher(16, "2omg");
            Teacher t5 = new Teacher(19, "1hehe");
            List l = new ArrayList();
            l.add(t5);
            l.add(t4);
            l.add(t3);
            l.add(t2);
            l.add(t1);
            Collections.sort(l);
            System.out.println(l);
        }
    }

    -------------------------

    end

  • 相关阅读:
    java获取客户端用户真实ip
    electron制作上位机软件篇(三)启动项目并进行打包
    electron制作上位机软件篇(二)使用serialport进行串口通信
    electron制作上位机软件篇(一):编译安装serialport
    STM32学习篇-蜂鸣器
    STM32学习篇-跑马灯
    日志级别的选择:Debug、Info、Warn、Error还是Fatal
    常用的正则验证
    kindEditor富文本编辑器
    表单验证jq.validate.js
  • 原文地址:https://www.cnblogs.com/luangeng/p/6057556.html
Copyright © 2020-2023  润新知