public class DataItem {
private int iData;
public DataItem(int i){
iData = i;
}
public int getkey(){
return iData;
}
}
public class HashDouble {
/**
* 开放地址法之在Hash解决冲突(最常用的)
*/
private DataItem [] hashArray;
private int arraySize;
private DataItem nonItem;
public HashDouble(int size){
arraySize = size;
hashArray = new DataItem[arraySize];
nonItem = new DataItem(-1);
}
public void displayTable(){
System.out.println("table: ");
for(int i=0;i<hashArray.length;i++){
if(hashArray[i]!=null){
System.out.println(hashArray[i].getkey()+" ");
}else{
System.out.println("** ");
}
}
}
//hash映射 key-index
public int hashFun1(int key){
return key%arraySize;
}
//步数映射
public int hashFun2(int key){
return 5-key%5;
}
//哈希插入
public void insert(int key,DataItem item){
int hashVal = hashFun1(key);
int stepSize = hashFun2(key);
while(hashArray[hashVal] != null &&
hashArray[hashVal].getkey()!=-1){
hashVal+=stepSize;
hashVal%=arraySize;
}
hashArray[hashVal] = item;
}
//哈希删除
public DataItem delete(int key){
int hashVal = hashFun1(key);
int stepSize = hashFun2(key);
while(hashArray[hashVal]!=null){
if(hashArray[hashVal].getkey() == key){
DataItem temp = hashArray[hashVal];
hashArray[hashVal] = nonItem;
return temp;
}
hashVal+=stepSize;
hashVal%=arraySize;
}
return null;
}
//哈希查找
public DataItem find(int key){
int hashVal = hashFun1(key);
int stepSize = hashFun2(key);
while(hashArray[hashVal]!=null){
if(hashArray[hashVal].getkey() == key){
return hashArray[hashVal];
}
hashVal+=stepSize;
hashVal%=arraySize;
}
return null;
}
}