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 ^ 2)である単純なアルゴリズムとは対照的に、妥当なソートアルゴリズムを想定したO(n log n)です。たくさんのアイテムがない場合でも、ナイーブは完璧に機能します。

于 2011-01-14T23:16:12.143 に答える
1

デビッドのバージョンが機能します。D2010 以降を使用している場合は、ハッシュを使用して重複をチェックし、O(n) 時間でリストを処理できる DeHL の Set コレクションを使用することもできます。

于 2011-01-14T23:25:44.823 に答える
1

重複をチェックする時点によって異なります。

アイテムを追加している時点で、すべてのアイテムを同時に追加している場合 (または、重複したチェックをツリービューが作成されるポイントに移動することが可能/適切な場合は、すでにデータが取り込まれたツリー) の場合、追加済みの項目のリストを維持するのが最も簡単な方法です。たとえば、単純な文字列リスト (この図のコードの文字列)から項目を追加するとします。

  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 に答える