【问题标题】:How to implement a linked list with different element types?如何实现具有不同元素类型的链表?
【发布时间】:2015-05-12 16:11:53
【问题描述】:

我想创建一个列表,其中每个元素都必须有 3 个字段:KeyType、KeyName、Value。 Value 字段的类型应为:字符串、基数、整数、字节、布尔值...取决于 KeyType 的值。我需要这个来制作类似于 Windows 注册表的东西。有可能吗?

【问题讨论】:

  • 使用变体类型。例如TValue.
  • TDictionary 也许。
  • 如果你需要树状组织的容器——对我来说,这是 Delphi 库最大的幸运。在其他方面有两种解决方案:array of TDataType 用于与索引相关的访问,TStringList.AddObject 用于与键相关的访问。还有THashadStringListTDictionary等。只要确定你的目标。

标签: list delphi types delphi-2009


【解决方案1】:

我会使用现成的通用链表。我确信 Spring 有一些,但如果你不想承担所有可能需要的依赖项,你可以使用 Chris Rolliston 的简单链表:https://code.google.com/p/ccr-exif/source/browse/blogstuff/CCR.SimpleLinkedList.pas?r=34

然后你只需要决定有效载荷的类型。使用变体类型,例如 TValueVariant,尽管后者会将您限制在 Windows 上。或者您可以制作自己的定制变体类型:

type
  TMyValue = record
    StringValue: string; // managed type must be outside variant part of record
    case DataType: TDataType of
    dtInteger:
      (IntegerValue: Integer);
    dtCardinal: 
      (CardinalValue: Cardinal);
    ....
  end;

然后你会像这样创建一个节点类型:

type
  TNode = record
    Name: string;
    Value: TValue; // or TMyValue
  end;

最后,您的链接列表只是TSimpleLinkedList<TNode>,您就完成了。

在我看来,为了保持一致性,在这里使用通用容器很重要。这样做可以让您将容器和元素的各个方面分开。

【讨论】:

  • 您不能在变体记录中使用字符串。编译器不允许托管类型存在。
【解决方案2】:

有两种选择。

您可以使用带有变体类型的正常记录/类,例如:

type
  TDataType = (dtBoolean, dtString, ....);
  PNode = ^TNode;
  TNode = record
    Prev, Next: PNode;
    Keyname: string;
    DataType: TDataType;
    Data: variant; //or TValue
  end;

或者使用变体记录

  TNode = record
    Prev, next: PNode;
    DataType: TDataType;
    Keyname: string;
    Datastring:string;
    case DataType of
      dtCardinal: (datacardinal: Cardinal);
      dtBoolean: (databoolean: boolean);
      ....
    end;

请注意,接口和字符串等托管类型不能包含在记录的变体部分中,因此您必须在此之前将它们放在正常部分中。

无法在链接列表中捕获注册表

请注意,注册表是一棵树,您需要一棵树而不是链表,这意味着您需要 3 个链接:root, left, right
你需要使用树形结构。任何树都可以映射到二叉树,因此您只需要 3 个(如果省略根节点,则需要两个)。

TDictionary<string, TNode>

也可以。 在这种情况下,TNode 不包括 Prev/next 成员,因为字典会处理这些。

【讨论】:

  • 我认为对注册表的引用不是关于树结构,而是更多关于保存变体类型的能力
猜你喜欢
  • 2019-08-07
  • 2013-09-14
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
相关资源
最近更新 更多