算法中比较器的使用

实现比较器的方法有两种:

  1. 实现Comparable,在比试中用的比较少。
  2. 人为的定义对类的比较,去实现comparator接口;

我们定义一个学生类,定义他的name,id,age属性,通过id和age对他进行排序,这时我们用比较器对其进行排序;前面元素减去后面元素如果为负数,则前面小排在前面。反之,则大的排在前面,为降序。

public class Code_11_Comparator {

    public static class Student{
        public String name;
        public int id;
        public int age;

        public Student(String name, int id, int age) {
            this.name = name;
            this.id = id;
            this.age = age;
        }
    }
    public static class IdAscendingComparator implements Comparator<Student>{

        @Override
        public int compare(Student o1, Student o2) {
            //以id进行升序排序
            return o1.id-o2.id;
        }
    }
    public static class IdDescendingComparator implements Comparator<Student>{

        @Override
        public int compare(Student o1, Student o2) {
            //以id进行降序排序
            return o2.id-o1.id;
        }
    }
    public static class AgeAscendingComparator implements Comparator<Student>{

        @Override
        public int compare(Student o1, Student o2) {
            //以age进行升序排序
            return o1.age-o2.age;
        }
    }
    public static class AgeDescendingComparator implements Comparator<Student>{

        @Override
        public int compare(Student o1, Student o2) {
            //以age进行降序排序
            return o2.age-o1.age;
        }
    }
    public static void print(Student[] students){
        for (Student s:students) {
            System.out.println("Name:"+s.name+" Id:"+s.id+" Age:"+s.age);
        }
        System.out.println("=======================");
    }
    public static void main(String[] args){
        Student student1=new Student("A",1,23);
        Student student2=new Student("B",2,21);
        Student student3=new Student("C",3,22);

        Student[] students=new Student[]{student1,student2,student3};
        Arrays.sort(students,new IdAscendingComparator());
        print(students);

        Arrays.sort(students,new IdDescendingComparator());
        print(students);

        Arrays.sort(students,new AgeAscendingComparator());
        print(students);

        Arrays.sort(students,new AgeDescendingComparator());
        print(students);

        //优先级队列(小顶堆。 IdAscendingComparator()是从小到大排序)
        PriorityQueue<Student> heap=new PriorityQueue<>(new IdAscendingComparator());
        heap.add(student1);
        heap.add(student2);
        heap.add(student3);
        while(!heap.isEmpty()){
            //每次推出堆顶输出
            Student student=heap.poll();
            System.out.println("Name:"+student.name+" Id:"+student.id+" Age:"+student.age);
        }

        //红黑树
        System.out.println("红黑树========");
        TreeSet<Student> treeSet=new TreeSet<>(new IdDescendingComparator());
        treeSet.add(student1);
        treeSet.add(student2);
        treeSet.add(student3);
        while (!treeSet.isEmpty()){
            Student student=treeSet.pollFirst();
            System.out.println("Name:"+student.name+" Id:"+student.id+" Age:"+student.age);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值