Java优先队列PriorityQueue

 Java优先队列PriorityQueue

概述:

PriorityQueue是Queue的实现,可以对其中元素进行排序,排序的对象可以是基本数据类型的包装类(Integer/Double),也可以是自定义的类。对于基本数据类型的包装类,优先队列中元素默认排列顺序是升序排列;对于自定义的类,要自己定义比较器。

常用方法:

Modifier and Type Method and Description
boolean add(E e)

将指定的元素插入到此优先级队列中。

void clear()

从此优先级队列中删除所有元素。

boolean contains(Object o)

如果此队列包含指定的元素,则返回 true

Iterator iterator()

返回此队列中的元素的迭代器。

boolean offer(E e)

将指定的元素插入到此优先级队列中。

E peek()

检索但不删除此队列的头,如果此队列为空,则返回 null

E poll()

检索并删除此队列的头,如果此队列为空,则返回 null

boolean remove(Object o)

从该队列中删除指定元素的单个实例(如果存在)。

int size()

返回此集合中的元素数。

Object[] toArray()

返回一个包含此队列中所有元素的数组。

 T[] toArray(T[] a)

返回一个包含此队列中所有元素的数组

  • Methods inherited from interface java.util.Collection

    addAll, clear, contains, containsAll, equals, hashCode, isEmpty, iterator, parallelStream, remove, removeAll, removeIf, retainAll, size, spliterator, stream, toArray, toArray
  • Methods inherited from interface java.lang.Iterable

    forEach

 

构造方法详细信息

  • PriorityQueue

    public PriorityQueue()

    创建一个PriorityQueue ,具有默认的初始容量(11),根据它们的natural ordering对其元素进行排序 。

  • PriorityQueue

    public PriorityQueue(int initialCapacity)

    创建具有PriorityQueue初始容量的PriorityQueue,根据其natural ordering对其元素进行排序 。

    参数

    initialCapacity - 此优先级队列的初始容量

    异常

    IllegalArgumentException - 如果 initialCapacity小于1

  • PriorityQueue

    public PriorityQueue(Comparator comparator)

    创建具有默认初始容量的 PriorityQueue ,并根据指定的比较器对其元素进行排序。

    参数

    comparator - 将用于订购此优先级队列的比较器。 如果null ,该natural ordering的元素将被使用。

    从以下版本开始:

    1.8

  • PriorityQueue

    public PriorityQueue(int initialCapacity,
                         Comparator comparator)

    创建具有 PriorityQueue初始容量的PriorityQueue,根据指定的比较器对其元素进行排序。

    参数

    initialCapacity - 此优先级队列的初始容量

    comparator - 将用于订购此优先级队列的比较器。 如果null ,将使用natural ordering的元素。

    异常

    IllegalArgumentException - 如果 initialCapacity小于1

 优先队列的使用:

1.优先队列中保存的是基本数据类型的包装类

自定义比较器降序排列(后-前)

不用自定义比较器,默认升序排列

//自定义比较器,降序排列
static Comparator cmp = new Comparator() {
      public int compare(Integer e1, Integer e2) {
        return e2 - e1;
      }
    };
public static void main(String[] args) {
        //不用比较器,默认升序排列
        Queue q = new PriorityQueue<>();
        q.add(3);
        q.add(2);
        q.add(4);
        while(!q.isEmpty())
        {
            System.out.print(q.poll()+" ");
        }
        /**
         * 输出结果
         * 2 3 4 
         */
        //使用自定义比较器,降序排列
        Queue qq = new PriorityQueue<>(cmp);
        qq.add(3);
        qq.add(2);
        qq.add(4);
        while(!qq.isEmpty())
        {
            System.out.print(qq.poll()+" ");
        }
        /**
         * 输出结果
         * 4 3 2 
         */
}

 2.优先队列中保存的是自定义类

//矩形类
class Node{
    public Node(int chang,int kuan)
    {
        this.chang=chang;
        this.kuan=kuan;
    }
    int chang;
    int kuan;
}

public class Test {
    //自定义比较类,先比较长,长升序排列,若长相等再比较宽,宽降序
    static Comparator cNode=new Comparator() {
        public int compare(Node o1, Node o2) {
            if(o1.chang!=o2.chang)
                return o1.chang-o2.chang;
            else
                return o2.kuan-o1.kuan;
        }
        
    };
    public static void main(String[] args) {
        Queue q=new PriorityQueue<>(cNode);
        Node n1=new Node(1, 2);
        Node n2=new Node(2, 5);
        Node n3=new Node(2, 3);
        Node n4=new Node(1, 2);
        q.add(n1);
        q.add(n2);
        q.add(n3);
        Node n;
        while(!q.isEmpty())
        {
            n=q.poll();
            System.out.println("长: "+n.chang+" 宽:" +n.kuan);
        }
     /**
      * 输出结果
      * 长: 1 宽:2
      * 长: 2 宽:5
      * 长: 2 宽:3
      */
    }
}

 3.比较器的降序说明

Comparator cmp = new Comparator() {
        public int compare(Object o1, Object o2) {
            //升序
            return o1-o2;
            //降序
            return o2-o1;
        }
    }; 
  

 

你可能感兴趣的:(note)