13

是否存在可用于散列数据的现有数据结构,可以删除最旧的元素?

我现在正在考虑的方法是让一个字典和一个队列使用字典进行快速查找,并能够使用队列从字典中删除最旧的元素。

4

4 回答 4

15

您可以使用OrderedDictionary。这将保持插入顺序(与SortedDictionary按键排序的 a 不同)。然后,您可以删除第一个被认为是最旧的可用元素。

于 2013-04-02T00:41:57.547 回答
1

OrderedDictionary 是一个很好的建议,但如果您需要字典中的字符串以外的类型,试试这个;

public sealed class SizedDictionary<TKey, TValue> : Dictionary<TKey, TValue> {

private int maxSize;
private Queue<TKey> keys;

public SizedDictionary(int size) {
    maxSize = size;
    keys = new Queue<TKey>();
}

new public void Add (TKey key, TValue value) {
    if (key==null) throw new ArgumentNullException();
    base.Add(key, value);
    keys.Enqueue(key);
    if (keys.Count > maxSize) base.Remove(keys.Dequeue());
}

new public bool Remove (TKey key) {
    if (key==null) throw new ArgumentNullException();
    if (!keys.Contains(key)) return false;
    var newQueue = new Queue<TKey>();
    while (keys.Count>0) {
        var thisKey = keys.Dequeue();
        if (!thisKey.Equals(key)) newQueue.Enqueue(thisKey);
    }
    keys=newQueue;
    return base.Remove(key);
}
}

我使用的是密封类,因为我们只是隐藏了 add 和 remove 方法,所以如果要继承这个类,就不清楚使用的是哪个版本。更完整的解决方案将使用内部字典而不是继承,但这会更加冗长

于 2021-03-24T11:32:46.580 回答
0

System.Collections.Generic.SortedList只是一个按键排序的字典。如果键在某种程度上是临时的,RemoveAt当您想要添加另一个条目时,您可以简单地使用在达到特定大小时删除第一个元素。

很可能,由于您提到Dictionary,您可能没有临时密钥。但是,aDictionary只是KeyValuePair<K,V>对象的集合。因此,您可以有一个排序列表,其中值是 a KeyValuePair<K,V>,键是添加元素的日期/时间。

于 2013-04-02T00:44:20.530 回答
0

因为你有一个特定的要求,我会用后面的队列/缓冲区来实现字典(例如评论中提到的循环缓冲区)。

OrderedDictionary 是一个不错的选择,也是如何做到这一点的一个很好的来源(我不想在这里发布它,但你可以很容易地找到它)——你只需要比 ArrayList 更好的东西来保存你的元素(并进行出队) - 因为您不断删除“第一个”。

于 2013-04-02T01:13:45.997 回答