java - 不使用 putAll() 从一个 HashMap 复制到另一个 HashMap

标签 java hashmap linkedhashmap

我正在尝试在调整大小后将所有数据从旧的 HashMap 复制到新的 HashMap。

现在,M = 10,因此当mapSize为2*M时,桶的数量将增加一倍。

我把事情加倍了,我检查了一下,它有效。

我只是想知道如何将数据从第一个“原始”HashMap 移动到第二个而不创建另一个 Hashmap。

我必须保持均匀分布,这意味着我不能只是添加更多,我需要重新散列已经给出的条目。

关于如何在我的 resizeIfNeedBe() 方法中执行此操作有什么建议吗?

//K = type of keys
//V = type of values
public class SCHashMap<K, V> 
{
    private LinkedList<KVP<K,V>> [] buckets;
    private int mapSize;


    public SCHashMap(int M)
    {
        buckets = (LinkedList<KVP<K, V>>[]) new LinkedList[M];
        for(int i = 0; i < buckets.length; i++)
        {
            buckets[i] = new LinkedList<KVP<K, V>>();
        }
    }

    public void resizeIfNeedBe()
    {
        if (buckets.length * 2 <= mapSize) 
        {
            // need more buckets
            buckets = (LinkedList<KVP<K, V>>[]) new LinkedList[buckets.length* 2];

            //Making it so they aren't all Null
            for(int i = 0; i < buckets.length; i++)
            {
                buckets[i] = new LinkedList<KVP<K, V>>();
            }

        }

    }

    public int bucketSize(int num)
    {
        return buckets[num].size();
    }

    private int bucket(K key)
    {
        return Math.abs(key.hashCode()) % buckets.length;
    }

    public void put(K key, V value)
    {
        resizeIfNeedBe();
        int b = bucket(key);
        for(KVP<K,V> pair : buckets[b])
        {
            if(pair.getKey().equals(key))
            {
                pair.setValue(value);
                return;
            }
        }
        buckets[b].addFirst(new KVP<>(key,value));
        mapSize++;
    }

    public V get(K key)
    {
        int b = bucket(key);
        for(KVP<K,V> pair : buckets[b])
        {
            if(pair.getKey().equals(key))
            {
                return pair.getValue();
            }
        }
        return null;
    }

    public int size()
    {
        return mapSize;
    }

}

最佳答案

看起来您需要 resizeIfNeedBe 来保留旧条目,仅此而已。我可能会这样做:

          // need more buckets
        LinkedList<KVP<K, V>> oldBuckets = buckets;
        buckets = (LinkedList<KVP<K, V>>[]) new LinkedList[buckets.length* 2];

        //Making it so they aren't all Null
        for(int i = 0; i < buckets.length; i++)
        {
            buckets[i] = new LinkedList<KVP<K, V>>();
        }

        // we know there are no duplicates so we can put things back in easily
        for (int i = 0; i < oldBuckets.length; i++) {
            for (KVP<K, V> entry : oldBuckets[i]) {
               buckets[bucket(entry.getKey())].add(entry);
            }
        }

关于java - 不使用 putAll() 从一个 HashMap 复制到另一个 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35440916/

相关文章:

java - 无法将字符串对象从 DialogFragment 传递到 MainActivity

java - 从复杂的服务器响应中提取字段

java - 将两个 HashMap 与相等的键进行比较并检查较高的值

java - Linkedhashmap<字符串,对象>

java - 如何使用其键获取 LinkedHashMap 中键/值的位置

java - socket.connect(endpoint) 和 new Socket(ip,port) 有什么区别

java - Java Try/Catch block 的基准测试

java - 使用来自现有列表的 HashMap 的值创建一个新列表

java - 将字符串与 HashMap 中的键值进行比较时忽略大小写

java - 将大型 HashMap 存储到 Java 文件中的方法?