Как написать метод put для HashMap в Java? - PullRequest
0 голосов
/ 05 мая 2019

Я пишу метод put для своего кода HashMap и не могу понять, в чем проблема.

Мои инструкции читаются как:

Если данный ключ уже присутствует в HashMap, старое значение должно быть заменено новым значением. Если происходит столкновение, следует использовать линейное зондирование, чтобы найти следующий «открытый» индекс массива. Если на карту будет добавлен дополнительный элемент, а коэффициент загрузки будет больше или равен MAX_LOAD_FACTOR, то карту следует перефразировать, прежде чем идентифицировать сегмент, чтобы попытаться сохранить дополнительный элемент.

Поэтому я не уверен, что мой метод пут не работает должным образом или метод перефразирования. Поэтому я собираюсь опубликовать их обоих. Надеюсь, это имеет смысл.

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 void put(K key, V value)
{
int hash = hashFunction(key);
    if (!containsKey(key))
    {
        if(loadFactor() >= MAX_LOAD_FACTOR)
        {
            rehash();
        }
        while(elementData[hash] != null)
        {
            hash = (hash + 1) % elementData.length;
        }
        elementData[hash] = new HashEntry(key, value);
        size++;
    }
    else
    {
        while(elementData[hash] != null || (elementData[hash] != REMOVED && !elementData[hash].getKey().equals(key)))
        {
            hash = (hash + 1) % elementData.length;
        }
            elementData[hash].value = value;
    }
}
 private int hashFunction(Object key)
{
    return Math.abs(key.hashCode()) % elementData.length;
}
private double loadFactor()
{
    return (double) size / elementData.length;
}
private void rehash()
{
    HashEntry[] oldElementData = elementData;
    elementData = new HashMap.HashEntry[2 * oldElementData.length];
    size = 0;
    for (int i = 0; i < oldElementData.length; i++)
    {
        HashEntry current = oldElementData[i];
        if(current != null)
        {
            put(current.getKey(), current.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;
    }
 }
}

выпадайте любые идеи, которые помогут. Благодарю.

1 Ответ

0 голосов
/ 09 мая 2019

Я обнаружил, что проблема в том, что мне нужно переназначить хэш после перефразирования, поэтому я создал это.

public void put(K key, V value)
{
    int hash = hashFunction(key);
    if (!containsKey(key))
    {
        if(loadFactor() >= MAX_LOAD_FACTOR)
        {
            rehash();
        }
        hash = hashFunction(key);
        while(elementData[hash] != null && !elementData[hash].equals(REMOVED))
        {
                hash = (hash + 1) % elementData.length;
        }
        elementData[hash] = new HashEntry(key, value);
        size++;
    }
    else
    {
        while(elementData[hash] != null && (!elementData[hash].equals(REMOVED) && !elementData[hash].getKey().equals(key)))
        {
            hash = (hash + 1) % elementData.length;
        }
            elementData[hash].value = value;
    }
}

Вот и все

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...