home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1997 August / PCO0897.ISO / filesbbs / os2 / fp1os2.arj / OS2 / DATA / 49 / C / 0 / F_26836 / JSbxHashtable.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-05-15  |  3.3 KB  |  218 lines

  1. import java.util.Dictionary;
  2. import java.util.Enumeration;
  3.  
  4. public class JSbxHashtable extends Dictionary implements Cloneable {
  5.    private JSbxHashtableEntry[] table;
  6.    private int count;
  7.    private int threshold;
  8.    private float loadFactor;
  9.  
  10.    public JSbxHashtable(int var1, float var2) {
  11.       if (var1 > 0 && !((double)var2 <= (double)0.0F)) {
  12.          this.loadFactor = var2;
  13.          this.table = new JSbxHashtableEntry[var1];
  14.          this.threshold = (int)((float)var1 * var2);
  15.       } else {
  16.          throw new IllegalArgumentException();
  17.       }
  18.    }
  19.  
  20.    public JSbxHashtable(int var1) {
  21.       this(var1, 0.75F);
  22.    }
  23.  
  24.    public JSbxHashtable() {
  25.       this(101, 0.75F);
  26.    }
  27.  
  28.    public int size() {
  29.       return this.count;
  30.    }
  31.  
  32.    public boolean isEmpty() {
  33.       return this.count == 0;
  34.    }
  35.  
  36.    public Enumeration keys() {
  37.       return new JSbxHashtableEnumerator(this.table, true);
  38.    }
  39.  
  40.    public Enumeration elements() {
  41.       return new JSbxHashtableEnumerator(this.table, false);
  42.    }
  43.  
  44.    public boolean contains(Object var1) {
  45.       if (var1 == null) {
  46.          throw new NullPointerException();
  47.       } else {
  48.          JSbxHashtableEntry[] var2 = this.table;
  49.          int var3 = var2.length;
  50.  
  51.          while(var3-- > 0) {
  52.             for(JSbxHashtableEntry var4 = var2[var3]; var4 != null; var4 = var4.next) {
  53.                if (var4.value.equals(var1)) {
  54.                   return true;
  55.                }
  56.             }
  57.          }
  58.  
  59.          return false;
  60.       }
  61.    }
  62.  
  63.    public boolean containsKey(Object var1) {
  64.       JSbxHashtableEntry[] var2 = this.table;
  65.       int var3 = var1.hashCode();
  66.       int var4 = (var3 & Integer.MAX_VALUE) % var2.length;
  67.  
  68.       for(JSbxHashtableEntry var5 = var2[var4]; var5 != null; var5 = var5.next) {
  69.          if (var5.hash == var3 && var5.key.equals(var1)) {
  70.             return true;
  71.          }
  72.       }
  73.  
  74.       return false;
  75.    }
  76.  
  77.    public Object get(Object var1) {
  78.       JSbxHashtableEntry[] var2 = this.table;
  79.       int var3 = var1.hashCode();
  80.       int var4 = (var3 & Integer.MAX_VALUE) % var2.length;
  81.  
  82.       for(JSbxHashtableEntry var5 = var2[var4]; var5 != null; var5 = var5.next) {
  83.          if (var5.hash == var3 && var5.key.equals(var1)) {
  84.             return var5.value;
  85.          }
  86.       }
  87.  
  88.       return null;
  89.    }
  90.  
  91.    protected void rehash() {
  92.       int var1 = this.table.length;
  93.       JSbxHashtableEntry[] var2 = this.table;
  94.       int var3 = var1 * 2 + 1;
  95.       JSbxHashtableEntry[] var4 = new JSbxHashtableEntry[var3];
  96.       this.threshold = (int)((float)var3 * this.loadFactor);
  97.       this.table = var4;
  98.       int var5 = var1;
  99.  
  100.       JSbxHashtableEntry var7;
  101.       int var8;
  102.       while(var5-- > 0) {
  103.          for(JSbxHashtableEntry var6 = var2[var5]; var6 != null; var4[var8] = var7) {
  104.             var7 = var6;
  105.             var6 = var6.next;
  106.             var8 = (var7.hash & Integer.MAX_VALUE) % var3;
  107.             var7.next = var4[var8];
  108.          }
  109.       }
  110.  
  111.    }
  112.  
  113.    public Object put(Object var1, Object var2) {
  114.       if (var2 == null) {
  115.          throw new NullPointerException();
  116.       } else {
  117.          JSbxHashtableEntry[] var3 = this.table;
  118.          int var4 = var1.hashCode();
  119.          int var5 = (var4 & Integer.MAX_VALUE) % var3.length;
  120.  
  121.          for(JSbxHashtableEntry var6 = var3[var5]; var6 != null; var6 = var6.next) {
  122.             if (var6.hash == var4 && var6.key.equals(var1)) {
  123.                Object var7 = var6.value;
  124.                var6.value = var2;
  125.                return var7;
  126.             }
  127.          }
  128.  
  129.          if (this.count >= this.threshold) {
  130.             this.rehash();
  131.             return this.put(var1, var2);
  132.          } else {
  133.             JSbxHashtableEntry var8 = new JSbxHashtableEntry();
  134.             var8.hash = var4;
  135.             var8.key = var1;
  136.             var8.value = var2;
  137.             var8.next = var3[var5];
  138.             var3[var5] = var8;
  139.             ++this.count;
  140.             return null;
  141.          }
  142.       }
  143.    }
  144.  
  145.    public Object remove(Object var1) {
  146.       JSbxHashtableEntry[] var2 = this.table;
  147.       int var3 = var1.hashCode();
  148.       int var4 = (var3 & Integer.MAX_VALUE) % var2.length;
  149.       JSbxHashtableEntry var5 = var2[var4];
  150.  
  151.       for(JSbxHashtableEntry var6 = null; var5 != null; var5 = var5.next) {
  152.          if (var5.hash == var3 && var5.key.equals(var1)) {
  153.             if (var6 != null) {
  154.                var6.next = var5.next;
  155.             } else {
  156.                var2[var4] = var5.next;
  157.             }
  158.  
  159.             --this.count;
  160.             return var5.value;
  161.          }
  162.  
  163.          var6 = var5;
  164.       }
  165.  
  166.       return null;
  167.    }
  168.  
  169.    public void clear() {
  170.       JSbxHashtableEntry[] var1 = this.table;
  171.       int var2 = var1.length;
  172.  
  173.       while(true) {
  174.          --var2;
  175.          if (var2 < 0) {
  176.             this.count = 0;
  177.             return;
  178.          }
  179.  
  180.          var1[var2] = null;
  181.       }
  182.    }
  183.  
  184.    public Object clone() {
  185.       try {
  186.          JSbxHashtable var1 = (JSbxHashtable)super.clone();
  187.          var1.table = new JSbxHashtableEntry[this.table.length];
  188.  
  189.          for(int var2 = this.table.length; var2-- > 0; var1.table[var2] = this.table[var2] != null ? (JSbxHashtableEntry)this.table[var2].clone() : null) {
  190.          }
  191.  
  192.          return var1;
  193.       } catch (CloneNotSupportedException var3) {
  194.          throw new InternalError();
  195.       }
  196.    }
  197.  
  198.    public String toString() {
  199.       int var1 = this.size() - 1;
  200.       StringBuffer var2 = new StringBuffer();
  201.       Enumeration var3 = this.keys();
  202.       Enumeration var4 = this.elements();
  203.       var2.append("{");
  204.  
  205.       for(int var5 = 0; var5 <= var1; ++var5) {
  206.          String var6 = var3.nextElement().toString();
  207.          String var7 = var4.nextElement().toString();
  208.          var2.append(var6 + "=" + var7);
  209.          if (var5 < var1) {
  210.             var2.append(", ");
  211.          }
  212.       }
  213.  
  214.       var2.append("}");
  215.       return var2.toString();
  216.    }
  217. }
  218.