码迷,mamicode.com
首页 > 编程语言 > 详细

Java优先队列

时间:2014-11-06 00:25:34      阅读:317      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   ar   使用   java   for   sp   

按照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优先队列

标签:style   blog   io   color   ar   使用   java   for   sp   

原文地址:http://www.cnblogs.com/dreamysmurf/p/4077526.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!