在java Hashmap中实现remove方法?

时间:2013-04-28 18:50:30

标签: java hash hashmap

因此,hashmap是java中基于哈希的地图结构实现。我已经弄清楚如何让hashmap put方法起作用,但我想写一个删除键值对的方法,而我在实现它时遇到了麻烦。

我现在唯一真正理解的是如何在钥匙为空或不存在的情况下告诉函数停止..我会喜欢任何帮助。将非常感谢关于该方法如何工作的解释,或者一些基本的伪代码示例。

这是我到目前为止在删除方法中所拥有的:

public void delete(K key) {  
        if (key == null) {  
            throw new IllegalArgumentException("Null Key!");
        }

        // Implement this method

    } 

如果有帮助,这是我完成的Map Entry课程:

public class MapEntry<K, V> {

    MapEntry<K, V> next;  
    K key;  
    V value;  

    public MapEntry(K key, V value) {  
        this.setKey(key);  
        this.setValue(value);  
    }  

    public void setKey(K key) {
        this.key = key;
    }

    public void setValue(V value) {  
        this.value = value;  
    }  

    public K getKey() {  
        return key;  
    }  

    public V getValue() {  
        return value;  
    }  

    public void setNext(MapEntry<K, V> next) {  
        this.next = next;  
    }  

    public MapEntry<K, V> getNext() {  
        return next;  
    }   

}

此外,如果它有帮助,这是我的整个HashMap类。

public class HashMap<K, V> {

    private int DEFAULT_CAPACITY = 10;  
    private MapEntry<K, V>[] Hash;  
    private int size;

    public HashMap() {  
        Hash = new MapEntry[DEFAULT_CAPACITY];  
    }  

    public int getHashCode(K key) {  
        int bucketIndex = key.hashCode() % Hash.length;  
        return bucketIndex;  
    }  

    public V get(K key) {  
        if (key == null) {  
            throw new IllegalArgumentException("Null Key!");
        }
        MapEntry<K, V> entry = Hash[getHashCode(key)];  
        while (entry != null && !key.equals(entry.getKey()))   
            entry = entry.getNext();  
        if (entry != null)
            return entry.getValue();
        else
            return null;
    }  

 /**
  * 
  * @param key
  * @param value
  * The put method works by associating the specified value with
  * the given key in the map. 
  * If the key is already in the map, 
  * the old value is replaced with the new one. 
  */


    public void put(K key, V value) {
        int keyBucket = hash(key);

        MapEntry<K, V> temp = Hash[keyBucket];
        while (temp != null) {
            if ((temp.key == null && key == null) 
                    || (temp.key != null && temp.key.equals(key))) {
                temp.value = value;
                return;
            }
            temp = temp.next;
        }

        Hash[keyBucket] = new MapEntry<K, V>(key, value);
        size++;
    }

    public void delete(K key) {  
        if (key == null) {  
            throw new IllegalArgumentException("Null Key!");
        }

        // Implement this method

    }  


    public void print(){
        //Bonus Method
    }

    private int hash(K key) {
        if (key == null) {
            return 0;
        } else {
            return Math.abs(key.hashCode() % this.Hash.length);
        }

}   }

1 个答案:

答案 0 :(得分:0)

使用您在get()中执行的相同逻辑,找到正确的存储桶,并在该存储桶中找到正确的MapEntry(我们称之为e)。然后只需从存储桶中删除e - 基本上,这是从单链接列表中删除节点。如果e是广告系列中的第一个元素,请将Hash的相应元素设置为e.next;否则,在next之前将元素的e字段设置为e.next。请注意,您还需要一个变量(在找到e时更新)以跟踪存储桶中的上一个条目。