当前位置:   article > 正文

Comparator比较器介绍、优先级队列PriorityQueue_java优先级队列compartor详解

java优先级队列compartor详解

一:比较器的概念

比较器的实质就是重载比较运算符

说到排序了,简单的说就是两个对象之间比较大小,那么在JAVA中提供了两种比较实现的方式,一种是比较死板的采用java.lang.Comparable接口去实现,一种是灵活的当我需要做排序的时候在去选择的java.util.Comparator接口完成。
Comparator这个接口,位于位于java.util包下,排序是comparator能实现的功能之一,该接口代表一个比较器,那么比较的方法就是:
任何比较器:
compare方法里,遵循一个统一的规范:
返回负数的时候,认为第一个参数应该排在前面
返回正数的时候,认为第二个参数应该排在前面
返回0的时候,认为无所谓谁放前面

Arrays 该类包含用于操作数组的各种方法(如排序和搜索)。

    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 IdShengAgeJiangOrder implements Comparator<Student> {
		// 根据id从小到大,但是如果id一样,按照年龄从大到小
		@Override
		public int compare(Student o1, Student o2) {
			return o1.id != o2.id ? (o1.id - o2.id) : (o2.age - o1.age);
		}
	}
    

    Arrays.sort(students, new IdShengAgeJiangOrder());    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

二:Comparable与Compartor的区别

Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

当前对象this与指定对象t比较“大小”,如果当前对象this大于指定对象t,则返回正整数,如果当前对象this小于指定对象t,则返回负整数,如果当前对象this等于指定对象t,则返回零。
在这里插入图片描述
在这里插入图片描述

Comparator:强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。

三:求数组中第k大的元素

PriorityQueue:优先级队列(Java语言自身提供的堆结构)。底层就是堆结构,默认是小根堆。

Queue<Integer> heap = new PriorityQueue<>(new Comparator<Integer>() {
   @Override
   public int compare(Integer o1, Integer o2) {
        return o2 - o1;
   }
});

   int[] arr = new int[]{2, 4, 1, 5, 7, 0};
   for (int i = 0; i < arr.length; i++) {
       heap.add(arr[i]);
   }
   int k = 3;      //求该数组中第三大的元素
   k--;
   while (k-- > 0) {
      heap.poll();
   }
     
   System.out.println(heap.peek());    //4
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

具体流程:

入队:
在这里插入图片描述
出队:
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/355137
推荐阅读
相关标签
  

闽ICP备14008679号