2

是的,我知道我发布了很多问题,但那是因为我需要保证我做对了,我做错了什么,或者我完全一无所知,并且在文档中找不到任何东西。无论如何,

我正在尝试检查重复节点。这是我想做的事情:

遍历我的节点,并比较每个节点的文本(记录),但是如果我有很多节点,那会不会太耗时和消耗内存?会有更好的方法吗?

谢谢!- 杰夫。

编辑:感谢 Deltics,我得到了它的工作!如果我们有一些人有同样的问题,这里有一些工作代码,在 VST 中使用 2 级节点!

Procedure UncheckDuplicates;
Var
 ParentNode,ChildNode : PVirtualNode;
 I,J                  : Integer;
 SL                   : TStringList;
 SkypeID              : String;
Begin

   SL := TStringlist.Create;
   try
        ParentNode                      := frmMain.vtSkype.GetFirst;

           for I := 0 to frmMain.vtSkype.RootNodeCount - 1 do
             begin
               ChildNode                := ParentNode.FirstChild;
                 for J := 0 to ParentNode.ChildCount - 1 do
                     begin
                        if NodeIsChecked(ChildNode) then
                          begin
                            SkypeID             := GetData(ChildNode).SkypeID;
                              if SL.IndexOf(SkypeID) <> -1 then
                                begin
                                  ChildNode.CheckState          := csUncheckedNormal;
                                end
                                else 
                                begin
                                  SL.Add(SkypeID);
                                end;
                          end;                          
                     ChildNode                := ChildNode.NextSibling;   
                     end;


               ParentNode               := ParentNode.NextSibling;
             end;


   finally
     SL.Free;
   end;

frmMain.vtSkype.Refresh;


End;

我不害怕分享我的代码,我欠社区的。:)

4

3 回答 3

1

通常,您会将所有字符串收集到一个列表中,然后对其进行排序。然后,您可以循环并检查相邻项目是否相等。

这是 O(n log n) 假设一个合理的排序算法,而不是 O(n^2) 的朴素算法。如果您没有大量物品,那么天真的会很好地工作。

于 2011-01-14T23:16:12.143 回答
1

大卫的版本将起作用。如果您有 D2010 或更高版本,您还可以使用 DeHL 的 Set 集合,它使用哈希来检查重复项,并且可以在 O(n) 时间内处理您的列表。

于 2011-01-14T23:25:44.823 回答
1

这取决于您在什么时候检查重复项。

If it is at the point at which you are adding items and you are adding all items at the same time, (or if it is possible/appropriate to move you duplicate check to point at which the treeview is populated, rather than working with an already populated tree) then maintaining a list of already added items as you go could be the simplest way, e.g. assuming you are adding items from a simple stringlist (in strings in this illustration code):

  alreadyAdded := TStringList.Create;
  try
    alreadyAdded.Sorted := TRUE;  // Sorting ensures an efficient binary lookup for IndexOf()...

    for i := 0 to Pred(strings.count) do
    begin
      if alreadyAdded.IndexOf(strings[i]) <> -1 then
        CONTINUE;

      AddNode(strings[i]);
      alreadyAdded.Add(strings[i]);
    end;
  finally
    alreadyAdded.Free;
  end;
于 2011-01-14T23:49:35.583 回答