【问题标题】:Key/Value Collection that maintains order维护顺序的键/值集合
【发布时间】:2011-12-18 20:22:43
【问题描述】:

我需要一个 delphi 键/值集合,它允许我以插入/添加键/值对的相同顺序迭代集合。

TList<T> 保证订单,但 TDictionary<T1, T2> 不保证。

我想我总是可以定义一个TList<TPair<Key, Value>>,但使用起来会更麻烦。

是否有可以满足我的要求的内置集合类型,或者包装 TList<TPair<Key, Value>> 是我的最佳选择?或者最好有一个TList<Key> 和一个TDictionary<Key, Value> 并遍历列表。

【问题讨论】:

  • 在 Key 上排序的 TList<TPair<Key,Value>> 还不错,因为 Key 查找操作可以使用二分查找,但您可能需要基于 tree 的数据结构。请注意,TList<TPair<x,y>> 不会强制执行唯一性,如果您想强制执行唯一键,您可能还希望实现这一点。
  • @WarrenP 如果不按顺序保存键,您将如何执行二进制搜索?

标签: delphi generics collections


【解决方案1】:

Spring4D library 提供了有序的字典。在撰写本文时,这些仅在 develop 分支上可用。

【讨论】:

    【解决方案2】:

    DeHL collections library 包含许多类似“有序字典”的类。有序的使用树(有顺序)而不是无序的哈希映射。

    我相信TSortedDistinctMultiMap 可能是您所需要的,如果您想强制执行唯一性,并且如果您不想强制执行Key 值唯一性,那么还有其他选择(类中没有Distinct名称),这将接近您的需要。

    2017 年更新:不再维护 DeHL 库。

    【讨论】:

    • 链接已失效,我认为没有维护该库。此外,排序的声音与有序的不同。排序通常意味着顺序基于比较函数。提问者希望保持插入顺序。
    • 我修复了链接,但图书馆肯定不再维护。
    【解决方案3】:

    如果您的键类型是string,而您的值类型是TObject 的某个后代,请使用TStringList。将您的值存储在 Objects 数组属性中。

    SL.AddObject('foo', obj1);
    
    SL.Add('bar');
    i := SL.IndexOf('bar');
    SL.Objects[i] := obj2;
    

    如果需要,请设置 OwnsObjects 属性。

    【讨论】:

    • 这放弃了 O(1) 按键访问
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 2023-03-15
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多