优先队列 Java

时不时,我们需要以特定的顺序处理一个队列的项目。优先队列是执行任务的数据结构。Java优先队列不同于正常(/community/tutorials/java-queue)。

优先选择Java

The java.util.PriorityQueue class, provides us an implementation of such a data type, by using priority heap implementation internally. Java PriorityQueue is an unbounded queue. It was introduced in Java 1.5 and enhanced in Java SE 8 release. PriorityQueue is internally implemented by following Priority Heap data structure. Here is the PriorityQueue class hierarchy: Priority Queue Java PriorityQueue Class Diagram: Java PriorityQueue Class Diagram

Java PriorityQueue 建设者

  1. PriorityQueue() - 创建具有默认初始容量的PriorityQueue,即 11
  2. PriorityQueue(Collection c) - 创建具有指定的集合元素的PriorityQueue
  3. PriorityQueue(int initialCapacity) - 创建具有指定的初始容量的PriorityQueue
  4. PriorityQueue(int initialCapacity, Comparator comparator) - 创建具有指定的初始容量的PriorityQueue和其元素的排序是根据指定的比较器( )5. PriorityQueue(PriorityQuee c)

优先排序元素按其自然排序排序,除非我们在创建时提供一个 Comparator元素。

Java 优先例子

让我们创建一个PriorityQueue,包含各种任务:

1PriorityQueue tasks=new PriorityQueue();
2tasks.add("task1");
3tasks.add("task4");
4tasks.add("task3");
5tasks.add("task2");
6tasks.add("task5");

这将创建一个任务的PriorityQueue,该任务将由自然排序的‘字符串’进行排序。让我们创建另一个任务排序的PriorityQueue,以自然排序的逆顺序进行排序。

1PriorityQueue reverseTasks=new PriorityQueue(Comparator.reverseOrder());
2reverseTasks.add("task1");
3reverseTasks.add("task4");
4reverseTasks.add("task3");
5reverseTasks.add("task2");
6reverseTasks.add("task5");

Java 优先化方法

现在,让我们看看 PriorityQueue 可用的所有方法,并使用它们:

  1. 联合国 ** 博勒语加(E)** - 这种方法在队列中插入指定的元素。 我们已经使用这种方法在队列中添加了5个任务.
  2. ** 比较者()** - 此方法返回用于命令此队列中的元素的比较器 。 如果没有指定参照者,则返回为无效,而且队列按照元素的自然顺序排序。 因此,如果我们这样做:(_ )_ system.out.println(任务.comparator ()); system.out.println(逆向任务.comparator ()); ______ 输出会为:______ 无效 java.util. Collections$ Reverseconverator@15db9742

  1. ** boolean 包含(object)** - 如果队列包含指定的元素,则返回为真。 让我们检查任务3 是否属于优先队列任务 :( _) __ system.out.println( tasks.comins ("task3")); _ ______ 此打印 :\ 真 \
  2. ** boolean offer(E) ** - 与添加()方法一样,这种方法也为队列添加了元素. 对容量受限的队列,要约()和加()方法实际上有些不同,但对于优先排队,两者是相同的. 与添加()不同的是,要约()即使未在队列中添加元素也不会丢出例外.
  3. ** E 偷看 () ** - 获取此队列的头部, 或者如果此队列为空则返回为无效 。 换言之,它以最优先的方式返回元素。 因此,以下代码: QQ system.out.println(任务.peek ()); (- ) system.out.println(任务.peek ()); (- ) QQ 给我们: (-- )任务1 (- )任务5 (- ) (- ). ** E调查()** - 这种方法还检索到队列头部(具有最高优先级的元素),或者如果队列为空则返回为无效. 但与偷看( S) 不同, 它也会删除元素 。 因此,如果我们调用民意调查(:
    system.out.println(关于任务的邮箱:+tasks.poll ()); System.out.println(关于反向任务的邮箱:+逆向Tasks.poll ()); ) QQ再偷看:QQ System.out.println ("Peek on josks:"+tasks.peek (") System.out.println ("Peek on 逆向任务:"+逆向任务.peek (")"); QQ 任务:任务1(__) ) 反向任务的投放:任务5 任务上皮克:任务2 逆向任务上皮克:任务4 QQ
  4. **int six () ** - 返回队列中的元素数.
  5. ** boolean 删除(object) ** - 如果队列存在,则从队列中删除指定的元素。 如果存在两个相同的元素,则只去除其中之一.
  6. ** Object[] to Array () ** - 返回包含队列中所有元素的数组. () )10. T[] toArray(T[]a) - 返回包含队列中所有元素的数组,返回的数组类型是指定的数组类型. () )11 (英语). ** Iterator 迭代 () ** - 返回队列的迭代 .
  7. **void clear () ** - 删除队列中的所有元素 。 (_) (英语)

除了这些,PriorityQueue还继承了从收藏对象类的方法。

Java 优先时间复杂性

  1. 对于 enqueing 和 dequeing 方法,时间复杂性为 O(log(n))
  2. 对于 remove(Object) 和 contains(Object) 方法,时间复杂性为线性
  3. 对于检索方法,它具有恒定的时间复杂性

因此,如果我们需要同步访问,我们需要使用 PriorityBlockingQueue

Published At
Categories with 技术
Tagged with
comments powered by Disqus