3

2つのVirtualStringTreeがあり、最初のVSTにデータが入力されており、2番目のVSTを確認して、最初のVSTにまだ存在しないノードを追加したいと思います。または、最初のVSTと重複していない2番目のVSTのノードを追加したいと思います。

procedure Tcreatevtform.copy2tosimvt(vt: Tvirtualstringtree);
var
  data: PMyRec;
  simvtdata: PMyRectF;
  rootnode, simvtnode: PVirtualNode;
  ty: string;
begin
  rootnode := vt.GetFirst; //vt is second virtualstringtree
  while Assigned(rootnode) do 
  begin
     data := vt.GetNodeData(rootnode);
     ty := data^.caption;
     if checksimduplicate(ty)=false then 
     begin
        simvtnode := similarvt.AddChild(nil); //similarvt is the first virtualstringtree
        simvtdata := similarvt.GetNodeData(simvtnode);
        simvtdata^.caption := data^.caption;
     end;
     rootnode := vt.GetNext(rootnode,false);
  end;
end;

function Tcreatevtform.checksimduplicate(t: string): boolean;
var
  data: PMyRectf;
  rootnode: PVirtualNode;
  typew: string;
begin
  Result := False;
  rootnode := similarvt.GetFirst;
  while Assigned(rootnode) do 
  begin
     data := similarvt.GetNodeData(rootnode);
     typew := data^.caption; // problem here, typew is always a constant or it is always the first
     if t=typew then 
     begin  
        // node's caption of vt (letter 'a' is the first node's caption in my
        // app. So this function is always false.
        Result := True;
        Break;
     end;
     similarvt.GetNext(rootnode, False);
  end;
end;

D7を使用しています。

4

1 に答える 1

4

リスト比較アルゴリズムを使用すると、1 つのリストにあって 2 番目のリストにないすべての項目を簡単に見つけることができます。基本的な考え方は次のとおりです。

  • 両方のリストを並べ替える
  • リストごとに 1 つずつ、2 つのインデックス変数を取り、各リストの先頭から開始します。
  • 並べ替え順序に従って、各リストの 2 つのインデックス付きアイテムを比較します。
    • それらが等しい場合、同じ項目が両方のリストにあります。両方のインデックスをインクリメントします。
    • 最初の項目が 2 番目の項目より小さい場合、2 番目のリストにはありません。最初のインデックスをインクリメントします。
    • 2 番目の項目が最初の項目より小さい場合、最初のリストには含まれていません。2 番目のインデックスをインクリメントします。
  • いずれかのリストの最後に到達するまで繰り返します。他のリストの残りのすべての項目は、最初のリストにはありません。

等号のケース、または最初の一意のケースまたは 2 番目の一意のケースのいずれかにアクションを追加して、これらのケースで何をすべきかを決定できます。特定のケースでは、2 番目にユニークなケースで項目を VST に追加する必要があります。ツリー構造を保持する必要がある場合は、さらに複雑になる可能性がありますが、それが基本的な考え方です。

于 2011-09-17T17:53:45.127 に答える