维护顺序的键/值集合

9
我需要一个Delphi键/值集合,能够按照插入/添加的顺序迭代遍历该集合中的键/值对。
TList保证顺序,但TDictionary不保证。
我想我可以定义一个TList>,但使用起来会更加麻烦。
是否有内置的集合类型满足我的需求,或者将TPair包装在TList中是最好的选择?还是可能更好的方法是使用TList和TDictionary,并通过列表进行迭代。

一个按Key排序的TList<TPair<Key,Value>>还不错,因为可以使用二分查找来进行Key查找操作,但是你可能需要一种基于tree的数据结构。请注意,TList<TPair<x,y>>不会强制执行唯一性,如果您想要强制执行唯一键,则可能还需要实现此功能。 - Warren P
@WarrenP你如何在不按顺序保存键的情况下执行二分查找? - David Heffernan
3个回答

3

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

SL.AddObject('foo', obj1);

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

如果需要,可以设置OwnsObjects属性。


这通过键提供 O(1) 访问。 - David Heffernan

3
DeHL集合库 包含很多类似“有序字典”的数据结构,其中的有序类使用树(具有顺序)而不是无序的哈希映射。
如果您想强制实施唯一性,TSortedDistinctMultiMap 可能正是您需要的,如果您不想强制执行 Key 值唯一性,则还有其他选择(在类名中没有 Distinct),这些选择将接近您所需的内容。
更新 2017 年:DeHL 库已不再维护。

链接已失效,我认为那个库已经不再维护了。此外,“sorted”和“ordered”的含义不同。“Sorted”通常意味着基于比较函数进行排序。“Asker”希望保持插入顺序。 - David Heffernan
我修复了链接,但是这个库明显已经不再维护了。 - Warren P

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接