javascript:HashMap.js

类别:网站制作 点击:0 评论:0 推荐:

/**
* used like java.lang.HashMap
*/
function testHashMap(){
 alert("HashMap test begin:");
 try{

 }
 catch(e){
  alert(e);
 }
 alert("HashMap test end");
}


function HashMap()
{
 private:
 this.len=8;
 this.table=new Array();
 this.length=0;
 this.hash=hash;
    function hash(x){
        var h = x.hashCode();
        h += ~(h << 9);
        h ^=  (h >>> 14);
        h +=  (h << 4);
        h ^=  (h >>> 10);
        return h;
    }

 this.rehash=rehash;
 function rehash() {
       
        var oldTable = this.table;  
   
        this.table=new Array();
       
  //transfer       
        for (var i = 0; i< oldTable.length; i++) {
            var e = oldTable[i];
            if (e != null) {
                oldTable[i] = null;
                do {
                    var next = e.next;
                    var j = this.indexFor(e.hash); 
                    e.next = this.table[j];
                    this.table[j] = e;
                    e = next;
                } while (e != null);
            }
        }
  //alert("rehash to :"+this.len);
    }
 


 this.indexFor=indexFor;
    function indexFor(h) {

  var index= h & (this.len-1);
  return index;
    }
 
 function Entry(h,k,v,n){
     
       this.value = v;
       this.next = n;
       this.key = k;
       this.hash = h;

    this.getKey=getKey;
       function getKey() {
            return this.key;
       }
 
    this.getValue=getValue;
       function getValue() {
            return this.value;
       }
       this.setValue=setValue;
       function setValue(newValue) {
            var oldValue = this.value;
            this.value = newValue;
            return oldValue;
       }
  
    this.equals=equals;
       function equals(o) {
          var e = o;
          var k1 = this.getKey();
          var k2 = e.getKey();
    var v1 = this.getValue();
          var v2 = e.getValue();
          return (k1.equals(k2) && v1.equals(v2));
    }
 
    this.hashCode=hashCode;
       function hashCode() {
           return this.key.hashCode() ^ this.value.hashCode();
       }

    this.toString=toString;
       function toString() {
            return this.getKey() + "=" + this.getValue();
       }
 }


    function HashIterator(table,index,ne){

        this.table=table;
  this.ne=ne;                 
        this.index=index;           
        this.current=null;
  
  this.hasNext=hasNext;
  function hasNext() {
   return this.ne != null;
        }

        this.next=next;
  function next() {
   
            var e = this.ne;
            if (e == null)
                throw "No such Element";
          
   var n = e.next;
            var t = this.table;
            var i = this.index;
            while (n == null && i > 0)
                n = t[--i];
            this.index = i;
            this.ne = n;
   this.current=e;

            return this.current;
        }
    }

 public:
 this.size=size;
    function size() {
        return this.length;
    }
 
 
 this.isEmpty=isEmpty;
    function isEmpty() {
        return this.length == 0;
    }
 
 this.get=get;
    function get(key) {
  var hash =this.hash(key);
        var i = this.indexFor(hash);
  
        var e = this.table[i];
       
  while (true) {
            if (e ==null)
                return null;
            if (e.hash == hash && key.equals(e.key))
                return e.value;
            e = e.next;
        }
  
    }
 
    this.containsKey=containsKey;
    function containsKey(key) {
        var hash = this.hash(key);
        var i = this.indexFor(hash);
        var e = this.table[i];
  
        while (e != null) {
            if (e.hash == hash && key.equals(e.key))
                return true;
            e = e.next;
        }
        return false;
    }

 
 this.put=put;
    function put(key,value) {
        var hash = this.hash(key);
  var i = this.indexFor(hash);
  
  
        for (var e = this.table[i]; e != null; e = e.next) {
            if (e.hash == hash && key.equals(e.key)) {
                var oldValue = e.value;
                e.value = value;
    return oldValue;
            }
        }
  
  this.addEntry(hash, key, value, i);

  var r=Math.ceil(this.length * 1.5);
  
  if(r > this.len){
   this.len= this.len << 1;
   this.rehash();
  }
        return null;
    }

 this.putAll=putAll;
 function putAll(map){
  var mod=false;
  for(var it=map.iterator();it.hasNext();){
   var e=it.next();
   if(this.put(e.getKey(),e.getValue())) mod=true;
  }
 }
 

 this.remove=remove;
    function remove(key) {
        var e = this.removeEntryForKey(key);
  
        return (e ==null ? null : e.value);
    }

 this.removeEntryForKey=removeEntryForKey;
    function removeEntryForKey(key) {
        var hash = this.hash(key);
        var i = this.indexFor(hash);
       
  var prev = this.table[i];
        var e = prev;
  
        while (e != null) {
            var next = e.next;
            if (e.hash == hash && key.equals(e.key)) {
                this.length--;
                if (prev.equals(e))
                    this.table[i] = next;
                else
                    prev.next = next;
                return e;
            }
            prev = e;
            e = next;
        }
        return e;
    }
 
 this.clear=clear;
    function clear() {
        for (var i = 0; i < this.table.length; i++)
            this.table[i] = null;
        this.length = 0;
    }
 
 this.containsValue=containsValue;
    function containsValue(value) {
  if (value == null) return false;

  var tab = this.table;
        for (var i = 0; i < tab.length ; i++)
            for (var e = tab[i] ; e != null ; e = e.next)
                if (value.equals(e.value))
                    return true;
  return false;
    }


 
   

    this.addEntry=addEntry;
    function addEntry(hash, key, value, bucketIndex) {
  this.table[bucketIndex] = new Entry(hash, key, value, this.table[bucketIndex]);
  this.length++;
    }

 
 this.iterator=iterator;
 function iterator(){
  var i=this.table.length;
  
  var next=null;
  while(i>0 && next==null){
   next=this.table[--i];
  }

  return new HashIterator(this.table,i,next);
 }

 this.hashCode=hashCode;
 function hashCode(){
  var h=0;
  for(var it=this.iterator();it.hasNext();){
   h+=it.next().hashCode();
  }
  return h;
 }
 this.equals=equals;
 function equals(map){
  if(map.size()!=this.size()) return false;
  
  for(var it=this.iterator();it.hasNext();){
   
   var e=it.next();
   var key=e.getKey();
   var value=e.getValue();
  
   if(!value.equals(map.get(key))) return false

  }
  return true;
 }
}

本文地址:http://com.8s8s.com/it/it30614.htm