Как не добавить дубликат в TVirtualStringTree? - PullRequest
3 голосов
/ 17 сентября 2011

У меня есть два VirtualStringTrees, первый VST заполнен данными, и я хочу проверить второй VST и добавить узлы, которых еще нет в первом VST. Или я хочу добавить те узлы из второго VST, которые не являются дубликатами первого 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.

1 Ответ

4 голосов
/ 17 сентября 2011

Поиск всех элементов, находящихся в одном списке, но не во втором, может быть легко осуществлен с помощью алгоритма сравнения списков.Вот основная идея:

  • Сортировка обоих списков
  • Возьмите 2 индексные переменные, по одной для каждого списка, и начните с начала каждого списка
  • Сравните двапроиндексированные элементы из каждого списка в соответствии с порядком сортировки.
    • Если они равны, то один и тот же элемент находится в обоих списках.Увеличьте оба индекса.
    • Если первый элемент меньше второго, то его нет во втором списке.Увеличьте первый индекс.
    • Если второй элемент меньше первого, то его нет в первом списке.Увеличьте второй индекс.
  • Повторяйте, пока не дойдете до конца одного из списков.Все остальные элементы в другом списке находятся не в первом списке.

Вы можете добавить действия к случаю равных или к первому уникальному или второму уникальному случаю, чтобы определить, что делать в этих случаях,В вашем конкретном случае вы захотите, чтобы второй уникальный случай добавил элемент в VST.Это может быть сложнее, если вам нужно сохранить древовидную структуру, но это основная идея.

...