Форум: "Начинающим";
Текущий архив: 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