优先级队列 to-do列表-容器深入研究

来源:互联网 发布:知行学院教务处登录 编辑:程序博客网 时间:2024/06/06 10:50

优先级队列 百科解释如下

如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了。这样,我们就引入了优先级队列 这种数据结构。 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素 (3)删除 一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 。对于优先权相同的元素,可按先进先出次序处理或按任意优先权进行。

就是原本队列是先进先出的,现在给它加一个优先级,优先级嘛就像会员一样,有些事情可以先做。但针对内部实现的话,很容易想到就需要一个排序的操作。在容器中一旦牵涉到排序都会出现一个Comparable接口当然这个也不例外。这个接口很好用实现以下,然后再重写一下compareTo方法即可,看下面的代码。

import java.util.PriorityQueue;public class ToDoList extends PriorityQueue<ToDoList.ToDoItem>{static class ToDoItem implements Comparable<ToDoItem> {private char primary;private int secondary;private String item;public ToDoItem(String td, char pri, int sec) {this.primary = pri;this.secondary = sec;this.item = td;}/** * 比较方法 * arg0 是比较对象 * 比它大 返回1 相等 0 小-1 */@Overridepublic int compareTo(ToDoItem arg0) {//先比较第一个优先级if(primary > arg0.primary) {return 1;} //如果第一个优先级的相等在比较第二个优先级的值if(primary == arg0.primary) {if(secondary == arg0.secondary) {return 0;}else if(secondary > arg0.secondary) {return 1;}}return -1;}/** * 重写toString方法,改变输出格式 */public String toString() {return Character.toString(primary) + secondary + ":" + item;}}/** * 调用父类中的add方法,往队列中添加指定类型的元素 * @param td * @param pri * @param sec */public void add(String td, char pri, int sec) {super.add(new ToDoItem(td, pri, sec));}public static void main(String[] args) {ToDoList toDoList = new ToDoList();toDoList.add("test1", 'C', 4);toDoList.add("test2", 'A', 4);toDoList.add("test3", 'B', 4);toDoList.add("test4", 'A', 2);toDoList.add("test5", 'B', 5);toDoList.add("test6", 'C', 12);toDoList.add("test7", 'C', 0);//依次取出并打印while(!toDoList.isEmpty()) {System.out.println(toDoList.remove());}}}
输出结果

A2:test4A4:test2B4:test3B5:test5C0:test7C4:test1C12:test6
从输出结果,很容易已看出,确实有优先级的样子,打印也不是按照加入的顺序打印的。主要归功于Comparable接口中的compareTo方法



0 0