【JAVA数据结构】优先队列与comparator接口自定义

Comparator 

是 Java 中的一个接口,用于定义对象之间的排序规则。它可以用于对集合中的对象进行排序,或者用于自定义排序算法。

优先队列中可以通过重写comparator接口来实现大根堆或者小根堆,让我迷惑的是comparate方法中什么时候是asc什么时候是desc

class Sortbyroll implements Comparator<Student> {
 
    // Method
    // Sorting in ascending order of roll number
    public int compare(Student a, Student b)
    {
 
        return a.rollno - b.rollno;
    }
}
class Sortbyroll2 implements Comparator<Student> {
 
    // Method
    // Sorting in desc order of roll number
    public int compare(Student a, Student b)
    {
 
        return b.rollno - a.rollno;
    }
}

compareTo() 方法

用于将 Number 对象与方法的参数进行比较。

返回值

  • 如果指定的数与参数相等返回 0。

  • 如果指定的数小于参数返回 -1。

  • 如果指定的数大于参数返回 1。

    class Sortbyname implements Comparator<Student> {
     
        // Method
        // Sorting in ascending order of name
        public int compare(Student a, Student b)
        {
     
            return a.name.compareTo(b.name);
        }
    }

PriorityQueue

PriorityQueue是一个实现了Queue接口的类,它可以根据元素的优先级来排序和检索。PriorityQueue的常用方法有:

  • add(E e):将指定的元素插入到优先队列中,如果队列已满,会抛出异常。
  • offer(E e):将指定的元素插入到优先队列中,如果队列已满,会返回false。
  • peek():返回优先队列的头部元素,但不删除它,如果队列为空,会返回null。
  • poll():返回并删除优先队列的头部元素,如果队列为空,会返回null。
  • remove(Object o):从优先队列中删除指定的元素,如果成功,会返回true,否则返回false。
  • contains(Object o):判断优先队列是否包含指定的元素,如果包含,会返回true,否则返回false。
  • size():返回优先队列的元素个数。
  • toArray():将优先队列转换为一个数组,并返回它。
  • comparator():返回优先队列使用的比较器,如果使用的是元素的自然顺序,会返回null。

优先队列的元素可以是基本类型的包装类,也可以是自定义的类,但必须实现Comparable接口或者提供一个Comparator对象来定义元素的比较规则。默认情况下,优先队列的头部元素是最小的元素,也就是说,元素按照升序排列。如果想要按照降序排列,可以使用Collections.reverseOrder()方法来创建一个反向的比较器。

offer和add

add和offer都是用于向优先队列中添加元素的方法,但是它们有一些区别。主要的区别是,当优先队列的容量有限制时,add方法会在无法添加元素时抛出异常,而offer方法会在无法添加元素时返回false。

例如,如果我们创建一个容量为3的优先队列,如下:

PriorityQueue<Integer> pq = new PriorityQueue<>(3);

然后我们尝试向这个队列中添加4个元素,如下:

pq.add(1); // 成功,返回true
pq.add(2); // 成功,返回true
pq.add(3); // 成功,返回true
pq.add(4); // 失败,抛出IllegalStateException异常

如果我们使用offer方法,结果如下:

pq.offer(1); // 成功,返回true
pq.offer(2); // 成功,返回true
pq.offer(3); // 成功,返回true
pq.offer(4); // 失败,返回false

下面是一个使用PriorityQueue的简单示例,它创建了一个存放整数的优先队列,并按照降序排列,为大根堆。

正常不定义时候是小根堆,asc排序。

// 定义一个实现了Comparator接口的类
class ReverseComparator implements Comparator<Integer> {
    // 实现compare方法,返回两个元素的大小关系
    public int compare(Integer a, Integer b) {
        return b - a;
    }
}

public class PriorityQueueExample {

    public static void main(String[] args) {
        // 创建一个优先队列,使用自定义的比较器
        PriorityQueue<Integer> pq = new PriorityQueue<>(new ReverseComparator());

        // 向优先队列中添加元素
        pq.add(10);
        pq.add(20);
        pq.add(15);

        // 打印优先队列的头部元素
        System.out.println("队列的头部元素: " + pq.peek());

        // 遍历并删除优先队列的元素
        while (!pq.isEmpty()) {
            System.out.println(pq.poll());
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值