Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.06.19;
Скачать: CL | DM;

Вниз

сформировать иерархию   Найти похожие ветки 

 
Scott Storch   (2011-03-12 13:26) [0]

есть строки список строк вида:

A \ B \ C
A \ A
B \ B

нужно сформировать иерархию. Должно получится так

A|
|
--B
|
--A
B|
|
--B

как организовать алгоритм, можете на словах объяснить, а то запутался совсем


 
clickmaker ©   (2011-03-12 13:32) [1]

а где C?


 
Scott Storch   (2011-03-12 13:36) [2]


> а где C?


забыл дописать, должно быть так

A|
 |
 --B|
     |
     --C    
 |
 --A
B|
 |
 --B


 
clickmaker ©   (2011-03-12 14:19) [3]

цикл 1
 разбиваешь каждую строку на массив
 node := nil
 цикл 2
   node := CreateNode(node, элемент массива)
 конец цикла 2
конец цикла 1

в CreateNode проверяешь (когда node = nil), если нод с уровнем 0 и таким заголовком есть, то просто возвращаешь его, иначе создаешь новый


 
sniknik ©   (2011-03-12 15:35) [4]

procedure TForm1.Button1Click(Sender: TObject);
var
 sList: TStringList;
 i: integer;

 function FindNode(inNode: TTreeNode; const val: string): TTreeNode;
 begin
   if Assigned(inNode)
     then result:= inNode.getFirstChild
     else result:= TreeView1.Items.GetFirstNode;

   while Assigned(result) do begin
     if result.Text = val then Exit;
     result:= result.getNextSibling;
   end;
 end;

 procedure AddLineChild(Parent: TTreeNode; const st: string);
 var
   n: integer;
   sVal: string;
   Node: TTreeNode;
 begin
   n:= Pos(" \", st);
   if n = 0 then begin
     TreeView1.Items.AddChild(Parent, st);
     Exit;
   end;

   sVal:= Copy(st, 1, n - 1);
   Node:= FindNode(Parent, sVal);
   if Assigned(Node)
     then AddLineChild(Node, Copy(st, n + 3, MaxInt))
     else AddLineChild(TreeView1.Items.AddChild(Parent, sVal), Copy(st, n + 3, MaxInt));
 end;

begin
 sList:= TStringList.Create;
 try
   sList.Text:= "A \ B \ C"#13#10+
                "A \ A"#13#10+
                "B \ B";

   TreeView1.Items.BeginUpdate;
   try
     TreeView1.Items.Clear;

     for i:= 0 to sList.Count - 1 do
       AddLineChild(nil, sList.Strings[i]);
   finally
     TreeView1.Items.EndUpdate;
   end;
 finally
   sList.Free;
 end;
end;



Страницы: 1 вся ветка

Текущий архив: 2011.06.19;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
1-1257256989
Igorishe
2009-11-03 17:03
2011.06.19
предварительный просмотр


6-1238737207
Alex_C
2009-04-03 09:40
2011.06.19
SendText в блокирующем сокете


2-1299874810
Евгений_С
2011-03-11 23:20
2011.06.19
RxRichEdit


2-1300183147
Avil
2011-03-15 12:59
2011.06.19
Mysql stored proc, записи в цикле


2-1300090835
ArNa
2011-03-14 11:20
2011.06.19
Хэлп плиз с Excel & MainMenu