在银行柜台办业务时,我们假设只有一个柜台在办理业务,
如果这时来了一个VIP客户,他的号码是V1.
要实现“VIP插队”的业务,用Queue就不行了,我们需要的是优先队列:PriorityQueue。
PriorityQueue实现了一个优先队列:从队首获取元素时,总是获取优先级最高的元素。
PriorityQueue默认按元素比较的顺序排序(必须实现Comparable接口),也可以通过Comparator自定义排序算法(元素就不必实现Comparable接口)。
@Test
void queueTest(){
Queue 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,因为队列为空
}
运行结果
Boss/V1
Bob/A1
Alice/A2
null
class UserComparator implements Comparator<User>{
@Override
public int compare(User o1, User o2) {
if(o1.number.charAt(0) == o2.number.charAt(0)){
// 如果两人的号都是A开头或者都是V开头,比较号的大小:
return o1.number.compareTo(o2.number);
}
if (o1.number.charAt(0) == 'V') {
// o1的号码是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;
}
}