Java之优先队列

Posted 虚幻黑洞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java之优先队列相关的知识,希望对你有一定的参考价值。

PriorityQueue属于Java Collections Framework。PriorityQueue基于优先级堆,它是Queue接口的实现。当我们需要一个Queue实现时,可以使用这种数据结构,

并且我们需要根据每个元素的优先级,以特定的排序顺序来维护该集合的元素。它在JDK 1.5中引入

Java 之优先队列要点

  • 在实例化PriorityQueue时,可以在构造函数中提供比较器。然后队列中的项目顺序将根据提供的比较器来决定。
  • 如果没有提供比较器,则将使用Collection的自然顺序(Comparable)来排序元素。
  • 此集合中不允许为null。
  • 排队队长是排序中最少的项目。
  • PriorityQueue元素之间的排序关系是任意决定的。
  • PriorityQueue未同步。PriorityBlockingQueue是PriorityQueue的线程安全对应。
  • PriorityQueue是无界的,它会根据队列中的元素数量动态增长。它在任何给定时间都具有内部能力,随着元素的添加而增加。这种内部容量和增量的政策没有指定或标准化。
  • 此PriorityQueue的iterator()不保证以任何特定顺序遍历队列元素。
  • 表现明智 remove()和contains()方法采用线性时间。peek(),element()和size()需要固定的时间。offer(),poll()和remove()取O(log n)时间。
  • offer()和add()是Queue接口的方法,由PriorityQueue实现。这些用于在队列中插入元素。他们在PriorityQueue方面的表现相同,没有区别。

PriorityQueue示例

以下示例说明了如何使用Java PriorityQueue集合。

PriorityQueueExample.java

package com.javapapers.java;

import java.util.Comparator;
import java.util.PriorityQueue;

public class PriorityQueueExample {
    public static void main(String[] args) {
        Comparator<String> queueComparator = new VowelComparator();
        PriorityQueue<String> priorityQueue = new PriorityQueue<String>(10,
                queueComparator);
        priorityQueue.add("orange");
        priorityQueue.add("fig");
        priorityQueue.add("watermelon");
        priorityQueue.add("lemon");
        while (priorityQueue.size() != 0) {
            System.out.println(priorityQueue.remove());
        }
    }
}

 

VowelComparator.java

此Comparator类用于确定上述PriorityQueue的排序顺序。

package com.javapapers.java;

import java.util.Comparator;

class VowelComparator implements Comparator<String> {

    @Override
    public int compare(String x, String y) {
        if (getVowelCount(x) < getVowelCount(y)) {
            return -1;
        } else if (getVowelCount(x) > getVowelCount(y)) {
            return 1;
        }
        return 0;
    }

    public int getVowelCount(String word) {
        int vowel = 0;
        for (int i = 0; i < word.length(); i++) {
            char chr = word.charAt(i);
            if (chr == ‘a‘ || chr == ‘A‘ || chr == ‘e‘ || chr == ‘E‘
                    || chr == ‘i‘ || chr == ‘I‘ || chr == ‘o‘ || chr == ‘O‘
                    || chr == ‘u‘ || chr == ‘U‘)
                vowel++;
        }
        return vowel;
    }
}

PriorityQueue示例输出:
fig
lemon
orange
watermelon

http://javapapers.com/java/search-file-using-nio/





以上是关于Java之优先队列的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ学习笔记五:RabbitMQ之优先级消息队列

Java之优先队列

Java数据结构之优先级队列

第五节:Java集合框架之优先级队列PriorityQueue(堆)

java数据结构----队列,优先级队列

死磕 java集合之PriorityQueue源码分析