首页 > 编程语言 >31 | JAVA集合PriorityQueue(同样是实现Queue接口的实现,和LinkedList同级别)

31 | JAVA集合PriorityQueue(同样是实现Queue接口的实现,和LinkedList同级别)

时间:2022-09-02 09:02:21浏览次数:74  
标签:PriorityQueue JAVA LinkedList number System Queue println poll public

PriorityQueue

PriorityQueueQueue的区别在于,它的出队顺序与元素的优先级有关,对PriorityQueue调用remove()poll()方法,返回的总是优先级最高的元素。

要使用PriorityQueue,我们就必须给每个元素定义“优先级”。我们以实际代码为例,先看看PriorityQueue的行为:

import java.util.PriorityQueue;
import java.util.Queue;
public class Main {
    public static void main(String[] args) {
        Queue<String> q = new PriorityQueue<>();
        // 添加3个元素到队列:
        q.offer("apple");
        q.offer("pear");
        q.offer("banana");
        System.out.println(q.poll()); // apple
        System.out.println(q.poll()); // banana
        System.out.println(q.poll()); // pear
        System.out.println(q.poll()); // null,因为队列为空
    }
}

因此,放入PriorityQueue的元素,必须实现Comparable接口PriorityQueue会根据元素的排序顺序决定出队的优先级。

如果我们要放入的元素并没有实现Comparable接口怎么办?PriorityQueue允许我们提供一个Comparator对象来判断两个元素的顺序。我们以银行排队业务( V开头为 VIP 用户,A 为普通用户 ) 为例,实现一个PriorityQueue

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
public class Main {
    public static void main(String[] args) {
        Queue<User> q = new PriorityQueue<>(new UserComparator());
        // 添加3个元素到队列:
        q.offer(new User("Bob", "A1"));
        q.offer(new User("Alice", "A2"));
        q.offer(new User("Boss", "V1"));
        System.out.println(q.poll()); // Boss/V1
        System.out.println(q.poll()); // Bob/A1
        System.out.println(q.poll()); // Alice/A2
        System.out.println(q.poll()); // null,因为队列为空
    }
}

class UserComparator implements Comparator<User> {
    public int compare(User u1, User u2) {
        if (u1.number.charAt(0) == u2.number.charAt(0)) {
            // 如果两人的号都是A开头或者都是V开头,比较号的大小:
            return u1.number.compareTo(u2.number);
        }
        if (u1.number.charAt(0) == 'V') {
            // u1的号码是V开头,优先级高:
            return -1;	
        } else {
            return 1;
        }
    }
}

class User {
    public final String name;
    public final String number;

    public User(String name, String number) {
        this.name = name;
        this.number = number;
    }

    public String toString() {
        return name + "/" + number;
    }
}

上面的UserComparator的比较逻辑其实还是有问题的,它会把A10排在A2的前面。

可采用字符串分割之后比较数字大小的策略。

标签:PriorityQueue,JAVA,LinkedList,number,System,Queue,println,poll,public
From: https://www.cnblogs.com/mmxingye/p/16648560.html

相关文章

  • 32 | JAVA集合Deque(一种接口,比Queue更丰富的接口,底层实现可为LinkedList)
    Deque如果把条件放松一下,允许两头都进,两头都出,这种队列叫双端队列(DoubleEndedQueue),学名Deque。Java集合提供了接口Deque来实现一个双端队列,它的功能是:既可以添加到队......
  • 33 | JAVA集合Stack(一种接口,不推荐使用)
    Stack栈(Stack)是一种后进先出(LIFO:LastInFirstOut)的数据结构。Stack只有入栈和出栈的操作:把元素压栈:push(E);把栈顶的元素“弹出”:pop();取栈顶元素但不弹出:peek()。......
  • 27 | JAVA集合TreeMap(Map接口下除HashMap实现的另一种实现)
    TreeMap我们已经知道,HashMap是一种以空间换时间的映射表,它的实现原理决定了内部的Key是无序的,即遍历HashMap的Key时,其顺序是不可预测的(但每个Key都会遍历一次且仅遍历一次......
  • 28 | JAVA集合Properties专门用来存取配置文件(底层仍为哈希表)
    使用Properties配置文件的特点是,它的Key-Value一般都是String-String类型的,因此我们完全可以用Map<String,String>来表示它由于历史遗留原因,Properties内部本质上是一......
  • 29 | JAVA集合Set(一种接口,Map的同级映射)
    Set如果我们只需要存储不重复的key,并不需要存储映射的value,那么就可以使用Set。Set用于存储不重复的元素集合,它主要提供以下几个方法:将元素添加进Set<E>:booleanadd(E......
  • 30 | JAVA集合Queue(一种接口,实现为LinkedList)
    Queue队列(Queue)是一种经常使用的集合。Queue实际上是实现了一个先进先出(FIFO:FirstInFirstOut)的有序表。它和List的区别在于,List可以在任意位置添加和删除元素,而Queue只......
  • 21 | JAVA注解
    注解什么是注解(Annotation)?注解是放在Java源码的类、方法、字段、参数前的一种特殊“注释”:Java的注解可以分为三类:第一类是由编译器使用的注解,例如:@Override:让编译器检......
  • 22 | JAVA泛型基础
    初步认识ArrayList<>ArrayListArrayList一种模板:ArrayList<T>,代码如下:publicclassArrayList<T>{privateT[]array;privateintsize;publicvoida......
  • 23 | JAVA集合简介(C++容器)
    集合简介C++中将容器分成三类:顺序、关联、hash。容器在JAVA中映射为集合。等号左边(接口)等号右边(实现)ListArrayList/LinkedListSetHashSet/TreeSet......
  • 24 | JAVA集合之List(实际为接口)
    使用List在集合类中,List是最基础的一种集合:它是一种有序列表。List下的两种具体实现ArrayList和LinkedList,本别对应数组和链表。List的接口List<E>接口在末......