Главная страница
    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
2-1289650085
istok
2010-11-13 15:08
2011.01.30
мониторинг принтеров на delphi..


2-1289371618
Irisss
2010-11-10 09:46
2011.01.30
TObjectList не преобразовывает item ы в Duble


15-1287347344
Юрий
2010-10-18 00:29
2011.01.30
С днем рождения ! 18 октября 2010 понедельник


2-1289474407
Сергей
2010-11-11 14:20
2011.01.30
Блокировка записи в базе данных на сервере


11-1229310616
L`Autour
2008-12-15 06:10
2011.01.30
Вопрос по перехвату LVN_GETDISPINFOW





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский