首页 > 代码库 > Java优先队列

Java优先队列

按照Java api的说法:

java.util.PriorityQueue.PriorityQueue()

Creates a PriorityQueue with the default initial capacity (11) that orders its elements according to their natural ordering.

优先队列PriorityQueue的默认排序方式为其中元素的自然顺序。下面利用这一特点,把它当成个小顶堆来求出数组中的前k大元素

package structure;import java.util.Iterator;import java.util.PriorityQueue;import java.util.Queue;/** * Java中的优先队列使用 * @author Dreamy * */public class PriorityQueueDemo {    /**     * @param args     */    public static void main(String[] args) {        //Java中的PriorityQueue 默认排序方式为自然顺序        int[] numbers = {4,5,2,1,9,6,8,7};        findTopK(numbers);    }    //找出数组中top k大    private static void findTopK(int[] numbers) {                Queue<Integer> queue = new PriorityQueue<Integer>();            final int k = 3;        for(int i=0;i<k;i++)            queue.add(numbers[i]);                for(int i=k;i<numbers.length;i++){            int min = queue.peek();            if(numbers[i]>min){                queue.poll();                queue.offer(numbers[i]);            }        }                Iterator<Integer> itr = queue.iterator();        while(itr.hasNext()){            int num = itr.next();            System.out.println(num);        }    }}

当然啦,PriorityQueue中还可以存放自定义的对象,可以让元素对象实现Comparable借口,重写compareTo方法来实现自定义排序。或者,也可以再构造PriorityQueue的时候,指定自定义的比较器Comparator(作为参数)。

另外PriorityQueue是非线程安全的,如果要考虑多线程下的同步问题,可以使用concurrent包下的PriorityBlockingQueue。 

Java优先队列