ContentProviderHeap.java
上传用户:huihesys
上传日期:2007-01-04
资源大小:3877k
文件大小:3k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. package net.wastl.webmail.misc;
  2. import net.wastl.webmail.ui.ContentProvider;
  3. /**
  4.  * ContentProviderHeap.java
  5.  *
  6.  * This class is a simple heap structure for generating a sorted order for
  7.  * content providers.
  8.  *
  9.  * Created: Mon Oct  4 13:28:09 1999
  10.  *
  11.  * @author Sebastian Schaffert
  12.  * @version
  13.  */
  14. public class ContentProviderHeap {
  15.     int num_entries;
  16.     ContentProvider[] keys;
  17.     public ContentProviderHeap(int capacity) {
  18. keys=new ContentProvider[capacity+1];
  19. num_entries=0;
  20.     }
  21.     protected ContentProviderHeap(int capacity,int num_entries,ContentProvider[] keys) {
  22. this(capacity);
  23. this.num_entries=num_entries;
  24. System.arraycopy(keys,0,this.keys,0,num_entries);
  25.     }
  26.     /**
  27.      * Insert a key/value pair
  28.      * Reorganize Heap afterwards
  29.      */
  30.     public void insert(ContentProvider key) {
  31. keys[num_entries]=key;
  32. num_entries++;
  33. increase(num_entries);
  34.     }
  35.     /**
  36.      * Return and delete the key with the lowest long value. Reorganize Heap.
  37.      */
  38.     public ContentProvider next() {
  39. ContentProvider ret=keys[0];
  40. keys[0]=keys[num_entries-1];
  41. num_entries--;
  42. decrease(1);
  43. return ret;
  44.     }
  45.     public boolean isEmpty() {
  46. return num_entries==0;
  47.     }
  48.     /**
  49.      * Remove an Object from the Heap.
  50.      * Unfortunately not (yet) of very good complexity since we are doing 
  51.      * a simple linear search here.
  52.      * @param key The key to remove from the heap
  53.      */
  54.     public void remove(ContentProvider key) {
  55. for(int i=0;i<num_entries;i++) {
  56.     if(key.equals(keys[i])) {
  57. num_entries--;
  58. int cur_pos=i+1;
  59. keys[i]=keys[num_entries];
  60. decrease(cur_pos);
  61. break;
  62.     }
  63. }
  64.     }
  65.     /**
  66.      * Lift an element in the heap structure
  67.      * Note that the cur_pos is actually one larger than the position in the array!
  68.      */
  69.     protected void increase(int cur_pos) {
  70. while(cur_pos > 1 && keys[cur_pos-1].getPreferredPosition()<keys[cur_pos/2-1].getPreferredPosition()) {
  71.     ContentProvider tmp1=keys[cur_pos/2-1];keys[cur_pos/2-1]=keys[cur_pos-1];keys[cur_pos-1]=tmp1;
  72.     cur_pos /= 2;
  73. }
  74.     }     
  75.     /**
  76.      * Lower an element in the heap structure
  77.      * Note that the cur_pos is actually one larger than the position in the array!
  78.      */
  79.     protected void decrease(int cur_pos) {
  80. while((cur_pos*2 <= num_entries && keys[cur_pos-1].getPreferredPosition() > keys[cur_pos*2-1].getPreferredPosition()) ||
  81.       (cur_pos*2+1 <=num_entries && keys[cur_pos-1].getPreferredPosition() > keys[cur_pos*2].getPreferredPosition())) {
  82.     int lesser_son;
  83.     if(cur_pos*2+1 <= num_entries) {
  84. lesser_son=keys[cur_pos*2-1].getPreferredPosition()<keys[cur_pos*2].getPreferredPosition()?cur_pos*2:cur_pos*2+1;
  85.     } else {
  86. lesser_son=cur_pos*2;
  87.     }
  88.     ContentProvider tmp1=keys[cur_pos-1];keys[cur_pos-1]=keys[lesser_son-1];keys[lesser_son-1]=tmp1;
  89.     cur_pos=lesser_son;
  90. }
  91.     }     
  92.    
  93.     public ContentProviderHeap getClone() {
  94. return new ContentProviderHeap(keys.length, num_entries,keys);
  95.     }
  96.  
  97. } // ContentProviderHeap