Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1057|回复: 0

自己实现优先队列 PriorityQueue java实例

[复制链接]

该用户从未签到

发表于 2011-9-21 20:39:09 | 显示全部楼层 |阅读模式
   java库里的PriorityQueue无法满足我,它不能固定容量,不遍历(遍历后就无序了),它的排序因字是从小到大(虽然可以用Comparator来反转大小顺序)。我所要的是可以固定容量(在一大堆数据通信中选择最大或最小的几个数时很有用),可遍历(不是一个个poll())。

   于是,在有空的时间里写了一下。内容是一个双向链表(带头的,头不作保存数据),用插入排序。个人认为一个个添加的用插入排序效果比较好。从队尾到队头找合适的插入位置,是稳定的排序。添加的实体可以用Comparator或Comparable,如果这两个都不是,就失去排序的效果
  1. import java.util.AbstractQueue;
  2. import java.util.Comparator;
  3. import java.util.Iterator;
  4. /**
  5. * @param <E>
  6. * 容量capacity大于0,最多只能添加capacity个,多出的被删除掉.<br/>
  7. * 删除时根据{@link Comparable}或{@link Comparator} 和 desc
  8. * 如果comparator==null时使用Comparable<br/>
  9. * non-thread safe
  10. * @author chenlb 2008-4-23 下午11:31:06
  11. */
  12. public class TopPriorityQueue<E> extends AbstractQueue<E> implements java.io.Serializable {
  13.     private static final long serialVersionUID = 1L;
  14.     private int size;
  15.     private LinkedItem head;
  16.     private LinkedItem last;
  17.     private int top;    //top>0后,容量有限制
  18.     private Comparator<? super E> comparator;
  19.     private boolean desc;    //降序
  20.    
  21.     /**
  22.      * 容量无限制,升序.
  23.      */
  24.     public TopPriorityQueue() {
  25.         this(0, null, false);
  26.     }
  27.    
  28.     /**
  29.      * 容量无限制,
  30.      * @param desc true为降序.
  31.      */
  32.     public TopPriorityQueue(boolean desc) {
  33.         this(0, null, desc);
  34.     }
  35.     /**
  36.      * 容量无限制,升序,用comparator排序
  37.      */
  38.     public TopPriorityQueue(Comparator<? super E> comparator) {
  39.         this(0, comparator, false);
  40.     }
  41.    
  42.     /**
  43.      * 容量无限制,用comparator排序
  44.      * @param desc true为降序
  45.      */
  46.     public TopPriorityQueue(Comparator<? super E> comparator, boolean desc) {
  47.         this(0, comparator, desc);
  48.     }
  49.    
  50.     /**
  51.      * 容量限制为capacity.超出容量限制的,会删除优先级最小(队尾).
  52.      */
  53.     public TopPriorityQueue(int capacity) {
  54.         this(capacity, null, false);
  55.     }
  56.    
  57.     public TopPriorityQueue(int capacity, boolean desc) {
  58.         this(capacity, null, desc);
  59.     }
  60.    
  61.     public TopPriorityQueue(int capacity, Comparator<? super E> comparator) {
  62.         this(capacity, comparator, false);
  63.     }
  64.    
  65.     public TopPriorityQueue(int capacity, Comparator<? super E> comparator, boolean desc) {
  66.         head = new LinkedItem();
  67.         last = head;
  68.         top = capacity;
  69.         this.comparator = comparator;
  70.         this.desc = desc;
  71.     }
  72.     @Override
  73.     public Iterator<E> iterator() {
  74.         // TODO 迭代器
  75.         return new It(head);
  76.     }
  77.     @Override
  78.     public int size() {
  79.         return size;
  80.     }
  81.    
  82.     public boolean offer(E o) {
  83.         // TODO 添加到适当的位置
  84.         if(o == null) {
  85.             throw new IllegalArgumentException("不能添加值为null的!");
  86.         }
  87.         LinkedItem temp = new LinkedItem(o);
  88.         /*last.next = temp;
  89.         temp.prev = last;*/
  90.         if(last == head) {    //第一个
  91.             last.next = temp;
  92.             temp.prev = last;
  93.             
  94.             last = temp;
  95.         } else {
  96.             LinkedItem tempPrev = last;
  97.             if(comparator != null) {
  98.                 while(tempPrev!=null && tempPrev != head) {
  99.                
  100.                     int r = comparator.compare(tempPrev.data, temp.data);
  101.                     if(desc) {
  102.                         r = 0 - r;
  103.                     }
  104.                     if(r == 1) {    //tempPrev > temp
  105.                         //重置,继续向前找
  106.                         tempPrev = tempPrev.prev;
  107.                     } else {    //找到插入的位置
  108.                         break;
  109.                     }
  110.                 }
  111.                
  112.             } else if(o instanceof Comparable) {    //用Comparable
  113.                
  114.                 while(tempPrev!=null && tempPrev != head) {
  115.                     Comparable<E> tPrev = (Comparable<E>) tempPrev.data;
  116.                     int r = tPrev.compareTo(temp.data);
  117.                     if(desc) {
  118.                         r = 0 - r;
  119.                     }
  120.                     if(r == 1) {    //tempPrev > temp
  121.                         //重置,继续向前找
  122.                         tempPrev = tempPrev.prev;
  123.                     } else {    //找到插入的位置
  124.                         break;
  125.                     }
  126.                 }
  127.             }
  128.             if(tempPrev != null) {    //插入
  129.                 if(tempPrev == last) {    //后面添加的
  130.                     last = temp;
  131.                 }
  132.                
  133.                 temp.next = tempPrev.next;
  134.                 if(tempPrev.next != null) {
  135.                     tempPrev.next.prev = temp;
  136.                 }
  137.                 tempPrev.next = temp;
  138.                 temp.prev = tempPrev;
  139.             }
  140.         }
  141.         
  142.         size++;
  143.         if(top > 0 && size > top) {    //去掉优先级最小的
  144.             tail();
  145.         }
  146.         return true;
  147.     }
  148.     /**
  149.      * 从栈底去除
  150.      */
  151.     public E tail() {
  152.         if(last == head) {
  153.             return null;
  154.         }
  155.         LinkedItem laster = last;
  156.         last = last.prev;
  157.         last.next = null;
  158.         laster.prev = null;
  159.         size--;
  160.         return laster.data;
  161.     }
  162.    
  163.     public E peek() {
  164.         // TODO 取得栈顶值
  165.         LinkedItem first = head.next;
  166.         if(first != null) {
  167.             return first.data;
  168.         }
  169.         return null;
  170.     }
  171.    
  172.     public E poll() {
  173.         // TODO 从栈顶去除
  174.         LinkedItem first = head.next;
  175.         if(first != null) {
  176.             head.next = first.next;
  177.             if(first.next != null) {
  178.                 first.next.prev = head;
  179.             }
  180.             size--;
  181.             return first.data;
  182.         }
  183.         return null;
  184.     }
  185.     private class It implements Iterator<E> {
  186.         LinkedItem curr;
  187.         
  188.         public It(LinkedItem curr) {
  189.             super();
  190.             this.curr = curr;
  191.         }
  192.         
  193.         public boolean hasNext() {
  194.             if(curr != null && curr.next != null) {
  195.                 return true;
  196.             }
  197.             return false;
  198.         }
  199.         
  200.         public E next() {
  201.             curr = curr.next;
  202.             E d = curr.data;
  203.             return d;
  204.         }
  205.         
  206.         public void remove() {
  207.             curr.prev.next = curr.next;
  208.             if(curr.next != null) {
  209.                 curr.next.prev = curr.prev;
  210.             }
  211.             size--;
  212.         }
  213.         
  214.     }
  215.    
  216.     /**
  217.      * @param <E>
  218.      * 链结点.
  219.      * @author chenlb 2008-5-4 下午04:48:17
  220.      */
  221.     private class LinkedItem {
  222.         LinkedItem prev;
  223.         E data;
  224.         LinkedItem next;
  225.         public LinkedItem() {
  226.         }
  227.         public LinkedItem(E o) {
  228.             this.data = o;
  229.         }
  230.     }
  231. }
复制代码
回复

使用道具 举报

该用户从未签到

发表于 2011-9-24 10:17:24 | 显示全部楼层
谢谢哦啊。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-10 20:10 , Processed in 0.360328 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表