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。 

转载于:https://www.cnblogs.com/dreamysmurf/p/4077526.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值