/**
* BruceXX
*/
function HashMap(){
var DEFAULT_CAPACITY=16;
var MAX_CAPACITY=2147483647;
var DEFAULT_LOAD_FACTOR=0.75;
/************ splitline ***************/
var loadFactor=DEFAULT_CAPACITY;
var threshold=DEFAULT_CAPACITY*DEFAULT_LOAD_FACTOR*1;
//entry table
var entryTable=new Array(DEFAULT_CAPACITY);
var size=0;
/**
* return null if no key exists, else return the newValue replaced..
*/
this.put=function(key,val){
if(key!=null){
var hash=newHash(hashCode(key));
var i=indexFor(hash,entryTable.length);
for(var obj=entryTable[i];obj!=null;obj=obj.next){
if(obj.hash==hash &&obj.key==key ){
var oldVal=obj.val;
obj.val=val;
return oldVal;
}
}
addEntry(hash,key,val,i);
return null;
}
};
/**
* remove the key element
*/
this.remove=function(key){
if(key!=null){
var hash=newHash(hashCode(key));
var i=indexFor(hash,entryTable.length);
var prev = entryTable[i];
var e = prev;
while (e != null) {
var next = e.next;
if (e.hash == hash && key==e.key) {
size--;
if (prev == e)
entryTable[i] = next;
else
prev.next = next;
if(e!=null)
return e.val;
}
prev = e;
e = next;
}
}
};
this.get=function(key){
if(key!=null){
var hash=newHash(hashCode(key));
var i=indexFor(hash,entryTable.length);
for(var obj=entryTable[i];obj!=null;obj=obj.next){
if(obj.hash==hash && obj.key==key ){
return obj.val;
}
}
}
};
this.containsKey=function(key){
if(key!=null){
var hash=newHash(hashCode(key));
var i=indexFor(hash,entryTable.length);
for(var obj=entryTable[i];obj!=null;obj=obj.next){
if(obj.key==key && obj.hash==hash ){
return true;
}
}
}
return false;
};
this.containsValue=function(value){
if(value!=null){
var tab = entryTable;
for (var i = 0; i < tab.length ; i++)
for (var e = tab[i] ; e != null ; e = e.next)
if (value.equals(e.val))
return true;
}
return false;
}
this.size=function(){
return size;
};
this.getkeylist=function(){
var tmpKey=new Array();
for(var i=0;i<entryTable.length;i++){
for(var obj=entryTable[i];obj!=null;obj=obj.next){
tmpKey.push(obj.key);
}
}
return tmpKey;
};
this.clear=function(){
//modCount++;
var t=entryTable;
for(var i=0;i<entryTable.length;i++)
t[i]=null;
size=0;
}
function addEntry(h,k,v,index){
var entry=entryTable[index];
var item={"hash":h,"key":k,"val":v,"next":entry};
entryTable[index]=item;
if(size++>=threshold){
resize(2*entryTable.length);
}
//alert(index+","+entryTable[index].next.hash);
};
function resize(newCapacity){
var newTable=new Array(newCapacity);
transfer(newTable);
entryTable=newTable;
threshold=newCapacity*loadFactor*1;
};
function transfer(newTable) {
var src = entryTable;
var newCapacity = newTable.length;
for (var j = 0,len=src.length; j <len; j++) {
var e = src[j];
if (e != null) {
src[j] = null;
do {
var next = e.next;
var i = indexFor(e.hash, newCapacity);
e.next = newTable[i];
newTable[i] = e;
e = next;
} while (e != null);
}
}
};
function indexFor(h,len){
return h&(len-1);
};
function newHash(h){
h += ~(h << 9);
h ^= (h >>> 14);
h += (h << 4);
h ^= (h >>> 10);
return h;
};
function hashCode(str){
var h = 0, off = 0;
var len = str.length;
for(var i = 0; i < len; i++){
var tmp=str.charCodeAt(off++);
h = 31 * h + tmp;
if(h>0x7fffffff || h<0x80000000){
h=h & 0xffffffff;
}
}
return h;
};
}
* BruceXX
*/
function HashMap(){
var DEFAULT_CAPACITY=16;
var MAX_CAPACITY=2147483647;
var DEFAULT_LOAD_FACTOR=0.75;
/************ splitline ***************/
var loadFactor=DEFAULT_CAPACITY;
var threshold=DEFAULT_CAPACITY*DEFAULT_LOAD_FACTOR*1;
//entry table
var entryTable=new Array(DEFAULT_CAPACITY);
var size=0;
/**
* return null if no key exists, else return the newValue replaced..
*/
this.put=function(key,val){
if(key!=null){
var hash=newHash(hashCode(key));
var i=indexFor(hash,entryTable.length);
for(var obj=entryTable[i];obj!=null;obj=obj.next){
if(obj.hash==hash &&obj.key==key ){
var oldVal=obj.val;
obj.val=val;
return oldVal;
}
}
addEntry(hash,key,val,i);
return null;
}
};
/**
* remove the key element
*/
this.remove=function(key){
if(key!=null){
var hash=newHash(hashCode(key));
var i=indexFor(hash,entryTable.length);
var prev = entryTable[i];
var e = prev;
while (e != null) {
var next = e.next;
if (e.hash == hash && key==e.key) {
size--;
if (prev == e)
entryTable[i] = next;
else
prev.next = next;
if(e!=null)
return e.val;
}
prev = e;
e = next;
}
}
};
this.get=function(key){
if(key!=null){
var hash=newHash(hashCode(key));
var i=indexFor(hash,entryTable.length);
for(var obj=entryTable[i];obj!=null;obj=obj.next){
if(obj.hash==hash && obj.key==key ){
return obj.val;
}
}
}
};
this.containsKey=function(key){
if(key!=null){
var hash=newHash(hashCode(key));
var i=indexFor(hash,entryTable.length);
for(var obj=entryTable[i];obj!=null;obj=obj.next){
if(obj.key==key && obj.hash==hash ){
return true;
}
}
}
return false;
};
this.containsValue=function(value){
if(value!=null){
var tab = entryTable;
for (var i = 0; i < tab.length ; i++)
for (var e = tab[i] ; e != null ; e = e.next)
if (value.equals(e.val))
return true;
}
return false;
}
this.size=function(){
return size;
};
this.getkeylist=function(){
var tmpKey=new Array();
for(var i=0;i<entryTable.length;i++){
for(var obj=entryTable[i];obj!=null;obj=obj.next){
tmpKey.push(obj.key);
}
}
return tmpKey;
};
this.clear=function(){
//modCount++;
var t=entryTable;
for(var i=0;i<entryTable.length;i++)
t[i]=null;
size=0;
}
function addEntry(h,k,v,index){
var entry=entryTable[index];
var item={"hash":h,"key":k,"val":v,"next":entry};
entryTable[index]=item;
if(size++>=threshold){
resize(2*entryTable.length);
}
//alert(index+","+entryTable[index].next.hash);
};
function resize(newCapacity){
var newTable=new Array(newCapacity);
transfer(newTable);
entryTable=newTable;
threshold=newCapacity*loadFactor*1;
};
function transfer(newTable) {
var src = entryTable;
var newCapacity = newTable.length;
for (var j = 0,len=src.length; j <len; j++) {
var e = src[j];
if (e != null) {
src[j] = null;
do {
var next = e.next;
var i = indexFor(e.hash, newCapacity);
e.next = newTable[i];
newTable[i] = e;
e = next;
} while (e != null);
}
}
};
function indexFor(h,len){
return h&(len-1);
};
function newHash(h){
h += ~(h << 9);
h ^= (h >>> 14);
h += (h << 4);
h ^= (h >>> 10);
return h;
};
function hashCode(str){
var h = 0, off = 0;
var len = str.length;
for(var i = 0; i < len; i++){
var tmp=str.charCodeAt(off++);
h = 31 * h + tmp;
if(h>0x7fffffff || h<0x80000000){
h=h & 0xffffffff;
}
}
return h;
};
}