【发布时间】:2009-12-03 17:43:13
【问题描述】:
我正在寻找一种非可视化持久树 (TStringTree) 实现。如果有人知道它有什么好的实现,请告诉我。
谢谢。
【问题讨论】:
我正在寻找一种非可视化持久树 (TStringTree) 实现。如果有人知道它有什么好的实现,请告诉我。
谢谢。
【问题讨论】:
您会在DI Containers 库(商业)中找到一个灵活的非可视树结构。但是,正如其他人在上面所指出的那样,推出自己的功能真的很容易,只添加您需要的功能。
您可以只使用两个基础对象:TNode 和一个 TNodeList(例如,一个 TObjectList 后代)。至少,TNode 只需要三个成员:您的字符串数据、对其父节点的引用(如果该节点是根节点,则为 nil)和一个 TNodeList,它是其子节点的列表。剩下的是(有点乏味的)各种伴随方法的实现,例如 Add()、Delete()、IndexOf()、MoveTo()、GetFirstChild()、GetNext() 等。基本树应该小于一个-通宵。
【讨论】:
什么树? B树?张开树?红黑树?这些都是常见的树算法类型。
您可能想看看 Julian Bucknall 的书,Tomes of Delphi: Data Structures and Algorithms。它有各种具有完整 Delphi 源代码的树实现;您可以轻松地调整它们中的任何一个以使用字符串。
【讨论】:
当然还有时髦的 DECAL(以前的 Rosetta),它尝试使用接口和变体创建一种 STL。
http://sourceforge.net/projects/decal/
更多的是为人们提供灵活性而不是速度。基本树结构是红黑 iirc。
【讨论】:
为什么不简单地使用 XML DOM 文档?
对于一个真正微不足道的字符串树来说,这可能有点过头了,但用于该目的不会太繁琐,而且它的好处是能够容纳几乎任何对字符串树的扩展(用于存储额外的数据如果需要,树中的每个字符串 - 作为属性等)。
根据我的经验,通常一开始是微不足道的需求很快就会超出最初的或预期的需求。 :)
如果您担心基于 COM 的 XML 实现和围绕它的 VCL 包装器的“开销”,您可以查看TNativeXML
【讨论】:
您可以只使用 tStringList 并添加其他 tStringLists 的对象...粗略,但如果您的数据只能表示为字符串数据,它就可以工作。
Child := tStringlist.create;
ParentList.AddObject('Child',Child);
当然,更好的解决方案是创建您自己的包含对象列表的对象。
【讨论】: