获取键及其值并有效地将其从 Dictionary<string,value> 中删除

Posted

技术标签:

【中文标题】获取键及其值并有效地将其从 Dictionary<string,value> 中删除【英文标题】:Get the key and its value and remove it from a Dictionary<string,value> efficently 【发布时间】:2019-02-01 02:50:55 【问题描述】:

我需要获取key和value的最小值并同时移除这对key-value,如果字典不是最好的数据结构,我必须以一种高效的方式去做这个我可以改变;这是我的字典:

Dictionary<string,int> myDict = new Dictionary<string,int>();

【问题讨论】:

高效是什么意思?时间?记忆?可维护性?你现在如何删除它? 时间和复杂性,我还没有删除它 在无序序列中找到一个最小值是 O(N)。按键从字典中删除一个元素是 O(1)。字典绝对不是这个特定操作的最佳数据结构,但是将其更改为其他内容会影响其他操作,例如快速查找/添加/删除键,这就是字典数据结构的目的。 您可以为此使用 Linq。见:Remove max or min from dictionary 如果您有 2 个具有相同最小值的对象怎么办? 【参考方案1】:

我创建了一个 DictionaryList,其中包含一个阴影排序的值列表。它与字典保持同步。您可以添加键值,删除键并删除最小值。这很快,进行 O(log n) 比较,其中 n 是数组中的元素数。您现在可以根据自己的喜好扩展它。

using System;
using System.Collections.Generic;

namespace MainClass

    class Program
    

        static void Main(string[] args)
        
            DictionaryList<string, int> dict = new DictionaryList<string, int>();

            dict.Add("assd", 45);
            dict.Add("gh", 78);
            dict.Add("uih", 235);
            dict.Add("sdfg", 345);
            dict.Add("jkl", 456);
            dict.Add("wer", 345);
            dict.Add("dfg", 454);
            dict.Add("we", 490895);
            dict.Add("dfgq", 78);
            dict.Add("jkel", 34);
            dict.Add("wepr", 1);
            dict.Add("zer", 345);
            dict.Add("kt", 345);
            dict.Add("qrk", 345);


            dict.RemoveMinimum();
            dict.Remove("wer");

        

    

    public class DictionaryList<Key, Value> : Dictionary<Key, Value> where Value : IComparable where Key : IComparable
    
        private class MinComparer<Key1, Value1> : IComparer<KeyValuePair<Key1, Value1>> where Value1 : IComparable where Key1:IComparable
        
            public int Compare(KeyValuePair<Key1, Value1> x, KeyValuePair<Key1, Value1> y)
            
                int comp = x.Value.CompareTo(y.Value);
                if (comp == 0)
                
                    return x.Key.CompareTo(y.Key);
                
                return comp;
            
        

        private List<KeyValuePair<Key, Value>> shadowList = new List<KeyValuePair<Key, Value>>();
        private MinComparer<Key, Value> mc = new MinComparer<Key, Value>();

        public new void Add(Key key, Value value)
        
            base.Add(key, value);

            KeyValuePair<Key, Value> shadow = new KeyValuePair<Key, Value>(key, value);
            int index = shadowList.BinarySearch(shadow, mc);
            if (index < 0) index = ~index;
            shadowList.Insert(index, shadow);
        

        public void RemoveMinimum()
        
            if (shadowList.Count > 0)
            
                this.Remove(shadowList[0].Key);
            
        

        public new void Remove(Key key)
        
            Value shadow = this[key];
            base.Remove(key);

            KeyValuePair<Key, Value> dummy = new KeyValuePair<Key, Value>(key, shadow);

            int index = shadowList.BinarySearch(dummy, mc);

            shadowList.RemoveAt(index);

        
    
 

【讨论】:

以上是关于获取键及其值并有效地将其从 Dictionary<string,value> 中删除的主要内容,如果未能解决你的问题,请参考以下文章

如何为复杂的 Json 有效负载设置属性及其值并进行序列化?

如何将 MongooseMap 转换为 JSON 对象以将其从 Node js 发送到 React?

搜索字典值并返回满足条件的键列表

如何从 iOS 中的字典中获取值

有效地将查询转换为预期的数组 - Laravel

事务隔离级别与MVCC