Java优先队列

故事扮演 提交于 2020-03-21 02:45:37

按照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。 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!