按照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。
时间: 2024-10-21 15:33:05