【问题标题】:How to write a remove method for hashes to remove a value?如何为哈希编写删除方法以删除值?
【发布时间】:2019-09-22 23:43:18
【问题描述】:

我为 HashMap 编写了一个删除方法,但我收到了错误,表明它没有返回正确的值。

说明如下:

如果在地图中找到键,remove(Object) 方法应该删除并返回与给定键关联的值。删除的条目应替换为 REMOVED 属性。如果map不包含key,则此方法无效。

因此,这是我的代码的一部分,它与我的代码相关,所以它不是长代码。

public class HashMap<K,V>
{
private final double MAX_LOAD_FACTOR = 0.75;
private HashEntry[] elementData;
private final HashEntry REMOVED = new HashEntry(null, null);
private int size;

public HashMap()
{
    this.elementData = new HashMap.HashEntry[10];
    size = 0;
}
public V remove(Object key)
{
    int h = hashFunction(key);
    while (elementData[h] != elementData[0] && elementData[h] != elementData[h].getKey())
    {
        h = (h + 1) % elementData.length;
    }
    if (elementData[h] == elementData[h].getKey())
    {
        elementData[h] = REMOVED;   // "removed" flag value
        size--;
        return elementData[h].getValue();
    }
    return elementData[h].getValue();
}
public class HashEntry
{
    private K key;
    private V value;

    public  HashEntry(K key, V value)
    {
        this.key = key;
        this.value = value;
    }
    public K getKey()
    {
        return key;
    }
    public V getValue()
    {
        return value;
    }
 }
}

我从错误中收到的消息是我的尺寸不正确,而且我返回了错误的值。我能得到这方面的帮助吗?我不知道问题出在哪里。

【问题讨论】:

  • 为什么要实现自己的哈希映射而不使用 java 标准的哈希映射?我认为您的错误是比较 elementData[h] == key 键与 hashmap 条目不同。但我看到索引有更多问题,你会得到一些 ArrayIndexOutOfBoundException ...
  • @fairtrax 实现我自己的哈希映射是什么意思?
  • @fairtrax 我更新了我的代码,但仍然不正确。
  • 您仍然不比较键,而是将条目结构与键进行比较。为什么要写代码?只需使用现有的java! docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

标签: java hash hashmap hashset hashcode


【解决方案1】:
public V remove(Object key)
{
    int h = hashFunction(key);

    while (elementData[h] != null)
    {
        if (elementData[h].getKey() != null && elementData[h].getKey().equals(key)) // linear probing to search
        {
            V store;
            store = elementData[h].value;
            elementData[h] = REMOVED;
            size--;
            return store;
        }
        h = (h + 1) % elementData.length;
    }
    return null;
}

我几乎拥有它,我只是假设返回 null 并在最后将值存储在不同的变量中。

【讨论】:

    猜你喜欢
    • 2018-11-17
    • 2013-10-09
    • 2010-12-31
    • 2021-01-15
    • 2023-04-09
    • 2016-05-28
    • 2015-11-17
    • 2016-01-06
    • 2023-03-17
    相关资源
    最近更新 更多