2013-04-28 55 views
0

所以一个hashmap是一个基于哈希的java地图结构的实现。我已经想出了如何让hashmap put方法起作用,但是我想编写一个方法来删除键值对,并且我在实现时遇到了麻烦。在Java Hashmap中实现remove方法?

我现在唯一能真正理解的唯一事情就是如何让功能在钥匙为空或不存在的情况下停下来。我很乐意提供任何帮助。关于该方法如何工作的解释,或者一些基本的伪代码示例将非常感谢。

这是我在删除方法至今:

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

} } 
+2

鉴于你正在复制一个有效的内置类,我建议你通过阅读这门课来学习更多。 – 2013-04-28 18:53:44

回答

0

使用您在get()做同样的逻辑,找到正确的桶和,该桶中,正确的MapEntry(姑且称之为e)。然后简单地从存储桶—中简单地删除e,这是从单链表中删除一个节点。如果e是存储桶中的第一个元素,请将相应元素Hash设置为e.next;否则,将e之前的元素的next字段设置为e.next。请注意,您需要多一个变量(因为您发现e而更新)以跟踪存储区中的上一个条目。

+0

谢谢你的帮助。 – 2013-04-28 19:24:48