0

所以hashmap是java中map结构的基于hash的实现。我已经想出了如何让 hashmap put 方法工作,但是我想编写一个删除键值对的方法,但我在实现它时遇到了麻烦。

我现在唯一能真正理解的是如何告诉函数在密钥为空或不存在的情况下停止。我希望得到任何帮助。关于该方法如何工作的解释或一些基本的伪代码示例将不胜感激。

到目前为止,这就是我在 delete 方法中所拥有的:

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

        // Implement this method

    } 

如果有帮助,这是我完成的地图条目类:

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);
        }

}   }
4

1 回答 1

0

使用您在 中执行的相同逻辑get(),找到正确的存储桶,并在该存储桶中找到正确的MapEntry(我们称之为e)。然后简单地e从存储桶中删除——基本上,这是从单链表中删除一个节点。如果e是桶中的第一个元素,则设置对应的元素Hashe.next;否则将next之前元素的字段设置ee.next。请注意,您还需要一个变量(根据您的发现进行更新e)来跟踪存储桶中的上一个条目。

于 2013-04-28T19:07:36.027 回答