zoukankan      html  css  js  c++  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。 

  • 相关阅读:
    Vue数据绑定和响应式原理
    JavaScript实现MVVM之我就是想监测一个普通对象的变化
    缓存的理解
    理解promise 02
    线段与线段的交点
    线段与线段交点的推导公式
    promise你懂了吗?
    wx import require的理解
    webgl example1
    sublime2常用插件
  • 原文地址:https://www.cnblogs.com/dreamysmurf/p/4077526.html
Copyright © 2011-2022 走看看