Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.01.30;
Скачать: [xml.tar.bz2];

Вниз

как собрать цепочки?   Найти похожие ветки 

 
картман ©   (2010-11-07 20:32) [0]

Всем привет.

Есть несколько массивов переменной длины(зубчатый двухмерный?), примерно таких записей: id, parent_id

нужно собрать цепочки записей из этих массивов. У одной записи может быть много наследников, родитель, понятно, один. Массив может содержать запись любого уровня иерархии. Связывать записи можно только из разных массивов... Надеюсь внятно объяснил... Хотя, наверное лучше так:

есть таблица: id, parent_id, выбираю записи в случайном порядке(нет, но для примера пусть будет так) в несколько наборов данных. Потом нужно найти цепочки по id->parent_id из разных НД, только из одного НД связывать нельзя, а вот по всем остальным пройтись нужно. Чет не никак не получается((


 
картман ©   (2010-11-07 20:33) [1]


> только из одного НД связывать нельзя,

между собой, в смысле


 
Jeer ©   (2010-11-08 10:20) [2]

На клиенте, что-ли ?

Ну так, засоси все наборы в виртуальную таблицу и там разбирайся "деревянными" методами, начиная с самого верхнего parent-a.


 
картман ©   (2010-11-08 12:04) [3]


> разбирайся "деревянными" методами

что это такое?


 
Jeer ©   (2010-11-08 12:25) [4]

Рекурсивный обход ( построение) дерева.
Пример - TTreeView.


 
картман ©   (2010-11-08 12:38) [5]


> Jeer ©   (08.11.10 12:25) [4]

спасибо, гляну.


 
картман ©   (2010-11-13 08:22) [6]


> Jeer ©   (08.11.10 12:25) [4]
>
> Рекурсивный обход ( построение) дерева.

медленно - много данных(


 
Sha ©   (2010-11-13 09:11) [7]

Правильно ли я понял, что родителя элемента a[i,j]
надо искать во всех массивах a[k] таких, что k<>i ?


 
картман ©   (2010-11-13 19:41) [8]


> Sha ©   (13.11.10 09:11) [7]

да. Только родитель и ребенок могут быть в любых массивах.


 
картман ©   (2010-11-13 19:42) [9]


> Только родитель и ребенок могут быть в любых массивах.

ну, в смысле a[i][j] может быть как ребенком, так и родителем.


 
картман ©   (2010-11-13 19:47) [10]

есть возможность определить непрямое родство - без этого совсем уж...


 
Sha ©   (2010-11-13 20:12) [11]

Диапазон значений ID известен?


 
картман ©   (2010-11-13 20:23) [12]


>  Sha ©   (13.11.10 20:12) [11]
>
> Диапазон значений ID известен?

можно сделать


 
Sha ©   (2010-11-13 21:15) [13]

Создаем вспомогательный массив-индекс,
пробегаемся по нему и вытаскиваем цепочки.

procedure TForm1.Button2Click(Sender: TObject);
type
 TIdRec= record
   Id, ParentId: integer;
   end;
 TRefRec= record
   Ref: integer;
   IsLeaf: boolean;
   end;
const
 MaxId  = 10;
 MinId  =  1;
 IsRoot = MinId - 1;
 NotId  = IsRoot - 1;
var
 a: array of array of TIdRec;
 p: array of TRefRec;
 i, j: integer;
 s: string;
begin;
 SetLength(a,2,3);
 with a[0,0] do begin; Id:=1; ParentId:=IsRoot; end;
 with a[0,1] do begin; Id:=4; ParentId:=2; end;
 with a[0,2] do begin; Id:=5; ParentId:=6; end;
 with a[1,0] do begin; Id:=2; ParentId:=1; end;
 with a[1,1] do begin; Id:=3; ParentId:=1; end;
 with a[1,2] do begin; Id:=6; ParentId:=IsRoot; end;

 Setlength(p,MaxId-MinId+1);
 for i:=0 to MaxId-MinId do
 with p[i] do begin;
   Ref:=-2;
   IsLeaf:=true;
   end;

 for i:=0 to Length(a)-1 do
 for j:=0 to Length(a[i])-1 do
 with a[i,j] do
 with p[Id-MinId] do begin;
   Ref:=ParentId-MinId;
   p[Ref].IsLeaf:=false;
   end;

 Memo1.Lines.Clear;
 for i:=0 to MaxId-MinId do
 if p[i].IsLeaf and (p[i].Ref>-2) then begin;
   s:="";
   j:=i;
   repeat;
     s:=s+IntToStr(j+MinId);
     j:=p[j].Ref;
     until j<0;
   Memo1.Lines.Add(s);
   end;

 end;


 
картман ©   (2010-11-13 21:57) [14]


> Sha ©   (13.11.10 21:15) [13]

Как-то не догадался обозначить листы и проверять пути только от них((
Спасибо.



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

Форум: "Начинающим";
Текущий архив: 2011.01.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.003 c
15-1286889440
Sanprof
2010-10-12 17:17
2011.01.30
FreeReport полсчитать сумму


15-1287146463
Petr V. Abramov
2010-10-15 16:41
2011.01.30
контекстная реклама жжет :)


2-1289307984
Faiwer
2010-11-09 16:06
2011.01.30
Destroy


4-1244384113
dmitry_12_08_73
2009-06-07 18:15
2011.01.30
Конфликт SetWindowsHookEx при быстром 5-тикратном нажатии Shift


15-1287419289
burda_a_m
2010-10-18 20:28
2011.01.30
Как в Windows 7 заставить работать MDAC?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский