PriorityQueue
347字约1分钟
2024-08-08
PriorityQueue
(优先级队列优先级队列)是 Queue
的另一个实现,它是基于优先级堆的无边界队列
放入 PriorityQueue
的元素,必须实现 Comparable
接口,PriorityQueue
会根据元素的排序顺序决定出队的优先级
栗子
以银行排队业务为例,实现一个 PriorityQueue
,V
是 vip
客户,A
是普通用户,vip
用户可以插队
public static void main(String[] args) {
Queue<User> queue = new PriorityQueue<>(new UserComparator());
// 添加元素到队列
queue.offer(new User("HanMeiMei", "A10"));
queue.offer(new User("Tom", "A1"));
queue.offer(new User("Jack", "A2"));
queue.offer(new User("LiHua", "V1"));
System.out.println(queue.poll()); // LiHua-V1
System.out.println(queue.poll()); // Tom-A1
System.out.println(queue.poll()); // HanMeiMei-A10
System.out.println(queue.poll()); // Jack-A2
System.out.println(queue.poll()); // null
}
放入队列元素实现 Comparable
接口
class UserComparator implements Comparator<User> {
@Override
public int compare(User u1, User u2) {
if (u1.number.charAt(0) == u2.number.charAt(0)) {
return u1.number.compareTo(u2.number);
}
if (u1.number.charAt(0) == 'V') {
return -1;
} else {
return 1;
}
}
}
class User {
public String name;
public String number;
public User(String name, String number) {
this.name = name;
this.number = number;
}
@Override
public String toString() {
return name + "-" + number;
}
}
看到上面结果比较的实现是有问题的,因为 A10
在 A2
前面了,我们对排序实现做如下修改即可
class UserComparator implements Comparator<User> {
@Override
public int compare(User u1, User u2) {
if (u1.number.charAt(0) == u2.number.charAt(0)) {
// A10 截取为 10,A2 截取为 2
String u1Number = u1.number.substring(1);
String u2Number = u2.number.substring(1);
// 采用 Integer 自己实现的 Comparator 接口
return Integer.valueOf(u1Number).compareTo(Integer.valueOf(u2Number));
}
if (u1.number.charAt(0) == 'V') {
return -1;
} else {
return 1;
}
}
}