2 u014186406 u014186406 于 2014.12.12 20:56 提问

关于java映射类一个问题

写了一个简易的映射类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;

}

}

要求让存储区里的数组可以动态扩展,当项数多于存储区数一半时,重新散列操作。

1个回答

devmiao
devmiao   Ds   Rxr 2014.12.13 00:39

你可以参照Java里面的HashMap源代码

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!