PriorityQueue

我们知道Queue是遵循先进先出(First-In-First-Out)模式的,但有些时候需要在Queue中基于优先级处理对象。举个例子,比方说我们有一个每日交易时段生成股票报告的应用程序,需要处理大量数据并且花费很多处理时间。客户向这个应用程序发送请求时,实际上就进入了队列。我们需要首先处理优先客户再处理普通用户。在这种情况下,Java的PriorityQueue会很有帮助。

PriorityQueue能高效地插入元素,高效地删除最小元素

删除是基于默认的自然顺序排列(也就是数字小的在队列头)或者按Comparator规定的顺序排列

最大/最小 加入新元素 删除极值 删除指定元素 查找指定元素 查找极值
Heap o(lgn) o(lgn) o(n) o(n) o(1)一头

比如说,Sue有一些轻微的小伤口最先来到了医院的急诊室

虽然Sue是先来的,但是,Joe被蛇咬伤更加需要先治疗,于是Joe被排在了Sue的前面

public static void main(String[] args){

PriorityQueue<String> pQueue = new PriorityQueue<>();

pQueue.add("B");

pQueue.offer("C");

pQueue.add("F");

pQueue.offer("A");

pQueue.add("L");

pQueue.add("D");

pQueue.add("E");

pQueue.add("J");

System.out.println("Head:" + pQueue.peek());

while(!pQueue.isEmpty()){

System.out.print(pQueue.poll() + " ");

}

}

输出:

Head: A

A B C D E F J L

从以上代码可以看出,即使add到PriorityQueue的顺序是乱序,但PriorityQueue会以默认的从小到大顺序被poll()出来

public static void main(String[] args){

PriorityQueue<String> pQueue = new PriorityQueue<>();

pQueue.add("B");

pQueue.offer("C");

pQueue.add("F");

pQueue.offer("A");

pQueue.add("L");

pQueue.add("D");

pQueue.add("E");

pQueue.add("J");

while(!pQueue.isEmpty()){

System.out.println(pQueue);

System.out.println("After calling pQueue.remove(),it removed: " + pQueue.remove());

System.out.println(pQueue);

System.out.println("-------------------------------");

}

}

输出:

// 直接打印PriorityQueue内部的元素,会很奇怪(并不是字母排序)。 因为内部是按binary heap顺序来打印的

[A, B, D, C, L, F, E, J]

After calling pQueue.remove(),it removed: A

[B, C, D, J, L, F, E]

-------------------------------

[B, C, D, J, L, F, E]

After calling pQueue.remove(),it removed: B

[C, E, D, J, L, F]

-------------------------------

[C, E, D, J, L, F]

After calling pQueue.remove(),it removed: C

[D, E, F, J, L]

-------------------------------

[D, E, F, J, L]

After calling pQueue.remove(),it removed: D

[E, J, F, L]

-------------------------------

[E, J, F, L]

After calling pQueue.remove(),it removed: E

[F, J, L]

-------------------------------

[F, J, L]

After calling pQueue.remove(),it removed: F

[J, L]

-------------------------------

[J, L]

After calling pQueue.remove(),it removed: J

[L]

-------------------------------

[L]

After calling pQueue.remove(),it removed: L

[]

-------------------------------

以下代码可以看出,虽然被remove()出来是按照PriorityQueue会以默认的从小到大顺序,但将PriorityQueue的内部打印出来会很奇怪(并不是字母顺序)因为内部是binary heap顺序打印的

results matching ""

    No results matching ""