C#类似hashtable的结构

我想用一个结构,类似hashtable一样可以存入键和值,新加入的数据对放在开头,当数据对超过一定数量时,就把最后一个数据对删掉。或者其它类似的结构,一列放键,一列放值,... 我想用一个结构,类似hashtable一样可以存入键和值,新加入的数据对放在开头,当数据对超过一定数量时,就把最后一个数据对删掉。 或者其它类似的结构,一列放键,一列放值 ,一列存放一个可以用于排序的值,这样当这个结构的数据超过一定数量时,就把用于排序的那列中最小的数据对删掉。
请大家帮忙写出这个结构的定义和代码,或者写出大概思路也行,尽量详细,我的编程能力有限,又急用,多谢了
展开
 我来答
makosharp
2014-03-19 · TA获得超过676个赞
知道小有建树答主
回答量:188
采纳率:100%
帮助的人:271万
展开全部

从需求可以看出你需要的是一个有固定大小、有先进先出队列特性的哈希表。从这点上看,我们可以有三种实现方式。


第一种,继承HashTable,为其增加容量和出入队列的处理。这是最容易实现的方法,因为Queue的接口HashTable都有,我们只需要重载相关方法即可。需要解决的问题是,HashTable的元素以ICollection形式存储,元素是没有位置索引的,要删除最旧的数据,我们需要一些辅助,这里是一个辅助队列,用于存储各项元素的key。由于队列总是先进先出,所以每次从队列中取出的元素就是最旧的一个键值对的key。


    public class HashTableQueue : Hashtable
    {
        uint _maxCapacity;
        Queue orderQ = new Queue();
        public int MaxCapacity { get { return (int)_maxCapacity; } }
        
        public HashTableQueue(uint maxCapacity)
            : base()
        {
            _maxCapacity = maxCapacity;
        }
        public override void Add(object key, object value)
        {
            //先加元素
            base.Add(key, value);
            //加的同时向辅助队列入队一个键
            orderQ.Enqueue(key);
            //判断是否容量超限,如超限则从队列中取出最旧的一个键,然后从哈希表删除对应的键值对
            if (Count > _maxCapacity)
                Remove(orderQ.Dequeue());
        }
    }

使用时需要在构造中指定最大容量(非负整形),为了安全起见,我并未允许在运行中修改最大容量。示例代码:

            HashTableQueue htq = new HashTableQueue(3);
            htq.Add(1, 1);
            htq.Add(2, 1);
            htq.Add(3, 5);
            htq.Add(4, 2);

运行完毕后的哈希表只有三个键值对,分别是{2,1},{3,5},{4,2}.


第二种方法,继承队列,用代码为其添加哈希表的特性。这个我就不写了,因为哈希表的接口和功能远比队列多,用代码去重现相对比较费事。比如哈希表的ICloneable、ISerializable、IDictionary接口,在队列上实现起来都比较复杂。最大的缺陷,队列不能直接删除指定元素。


第三种方法,你可以自己新建一个类来满足需求。这个方法我相当的不推荐,因为不继承自现有结构如HashTable、Dictionary的话,你至少要继承IDictionary<object,object>、IEnumerable接口,而且很可能内部需要使用 List<Tuple<object,object,int>这样的有三列的元素的集合来维护数据和排序值,光这些就够写一阵了。


如果你需要用第二、三种方法实现,请追问或给我小纸条。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式