Delphi 6 中是否有类似于地图或哈希表的东西?

17

Delphi 6中是否有原生的映射实现(将键映射到值和对象)-迄今为止互联网没有提供任何帮助。我刚刚接手了一个Delphi项目,我的背景是C ++和Java,以前的Delphi项目开发人员线性搜索所有内容。

谢谢。


2
对于你想做的事情,在 Delphi 6 中,我会选择 Andreas 的答案,但 TStringList 有一点局限性。如果你想要像 C++ STL 中那样真正的通用容器,你需要 Delphi 2010。(它们在 Delphi 2009 中被引入,但存在一些故障,直到下一个版本才得以修复。)通用映射实现称为 TDictionary,在 Generics.Collections 单元中。 - Mason Wheeler
4个回答

11

根据您的实际需求,您可能需要使用TStringList对象。


我只是想将一个字符串映射到另一个字符串: map.put("apple","圆形水果"); map.get("apple"); //返回 "圆形水果" - LoudNPossiblyWrong
6
TStringList 可以实现这个功能:使用 MyStringlist.Values['apple'] := 'round looking fruit'; 进行赋值,使用 S := MyStringlist.Values['apple']; 进行读取。 - mjn
1
TStringList在排序后使用二分查找进行查找。 - Caleb Hattingh
这正是我要找的。谢谢。 随后我发现了这个非常有用的链接: http://www.delphibasics.co.uk/RTL.asp?Name=TStringList - LoudNPossiblyWrong
2
@cjrh - 如果您使用名称-值,则不会出现这种情况。当以这种方式使用字符串列表时,它必须进行线性搜索,而且根本无法扩展。 - Lieven Keersmaekers

8
我使用了一个叫做Hashes.pas的库,来自Ciaran McCreesh。但由于他的网站已不再提供服务,你可以从以下URL查看单个PAS文件: Ciaran McCreesh - Hashes.pas链接 你也可以用“Ciaran McCreesh Hashes”这段文本在谷歌上找到它。
使用这个库,你可以做到以下几点:
aString := TStringHash.Create;
aString['color'] := 'blue';
ShowMessage(aString.Items['color']); // blue

或者对象:

aObj := TObjectHash.Create;
aObj['color'] := TBlueClass.Create;
bcBlue:=(aObj.Items['color'] as TBlueClass);
ShowMessage(bcBlue.Name); // Blue (supposing the TBLusClass as a Name property...

希望这对你和我一样有用。

顺便说一句,我认为Ares AudioGalaxy项目也在使用它。


2
我已经从Google缓存中复制到这里:http://pastebin.com/HkWAGFbe。希望Ciaran不介意。 - dan-gph

5
我已经测试了TStringList和一些THashTable的实现,两种实现之间的差异很小,在大多数情况下,TStringList(使用二分排序实现)比THashTable更有效。
对于少量值,TStringList比Hash更快,对于大量值,您必须找到一个复杂的哈希函数来最小化碰撞,并且这种复杂性会降低HashList的效率。

您必须使用StringList的Object指针来存储所需的所有信息(第二个字符串)。

此致敬意。


4

Jedi Code Library 包含一些高级容器类。例如,接口在 JclContainerIntf.pas 中声明:

  IJclMap = interface(IJclContainer)
    ['{A7D0A882-6952-496D-A258-23D47DDCCBC4}']
    procedure Clear;
    function ContainsKey(Key: TObject): Boolean;
    function ContainsValue(Value: TObject): Boolean;
    function Extract(Key: TObject): TObject;
    function GetValue(Key: TObject): TObject;
    function IsEmpty: Boolean;
    function KeyOfValue(Value: TObject): TObject;
    function KeySet: IJclSet;
    function MapEquals(const AMap: IJclMap): Boolean;
    procedure PutAll(const AMap: IJclMap);
    procedure PutValue(Key, Value: TObject);
    function Remove(Key: TObject): TObject;
    function Size: Integer;
    function Values: IJclCollection;
    property Items[Key: TObject]: TObject read GetValue write PutValue;
      {$IFNDEF BUGGY_DEFAULT_INDEXED_PROP} default; {$ENDIF ~BUGGY_DEFAULT_INDEXED_PROP}
  end;

你知道是否有本地库可供使用吗?我试图避免向项目中添加另一个库。 - LoudNPossiblyWrong
2
与Java相比,Delphi的核心运行库要小得多。有一些更高级别的容器类,如对象(如TObjectList和TInterfaceList),但并不太多。 - mjn

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