写了一个简易的映射类SimpleStringMap,代码如下:
public class SimpleStringMap {
public SimpleStringMap(){
bucketArray = new HashEntry[N_BUCKETS];
}
public void put(String key, String value){
int bucket = Math.abs(key.hashCode())%N_BUCKETS;
HashEntry entry = findEntry(bucketArray[bucket], key);
if(entry==null){
entry=new HashEntry(key, value);
entry.setLink(bucketArray[bucket]);
bucketArray[bucket]=entry;
}else{
entry.setValue(value);
}
}
public String get(String key){
int bucket = Math.abs(key.hashCode())%N_BUCKETS;
HashEntry entry = findEntry(bucketArray[bucket], key);
if(entry==null){
return null;
}else{
return entry.getValue();
}
}
public void delete(String key){
int bucket = Math.abs(key.hashCode())%N_BUCKETS;
HashEntry entry = findEntry(bucketArray[bucket], key);
if(entry!=null){
entry.deleteValue();
}
}
private HashEntry findEntry(HashEntry entry, String key){
while(entry!=null){
if(entry.getKey().equals(key)) return entry;
entry=entry.getLink();
}
return null;
}
/* 常量*/
private static final int N_BUCKETS=7;
/* 实例变量*/
private HashEntry[] bucketArray;
private int count;
class HashEntry{
public HashEntry(String key, String value){
entryKey = key;
}
public String getKey(){
return entryKey;
}
public String getValue(){
return entryValue;
}
public void deleteValue(){
entryValue=null;
}
public void setValue(String value){
entryValue=value;
}
public HashEntry getLink(){
return entryLink;
}
public void setLink(HashEntry nextEntry){
entryLink = nextEntry;
}
/* 实例变量*/
private String entryKey;
private String entryValue;
private HashEntry entryLink;
}
}
要求让存储区里的数组可以动态扩展,当项数多于存储区数一半时,重新散列操作。