В настоящее время у Delphi есть дженерики.Я только что изобрел очень красивую древовидную структуру данных.Пока не собираюсь выдавать код, не совсем с открытым исходным кодом, может быть, в ближайшем будущем, хотя и другие причины см. Ниже.
Но я дам несколько советов о том, как его воссоздать:
Предполагая, что все ваши узлы могут содержать одну и ту же структуру данных (что, как кажется, имеет место сверху, строку, идентификатор и затем ссылки.
Ингредиенты, которые необходимо создать заново, этоследующее:
- Обобщения
- Универсальный тип T
- Этот тип T должен быть ограничен классом и конструктором следующим образом:
(В вашем случае замените класс на запись, непроверенная, но также может работать)
два поля: массив себя (подсказка), данные: T;
свойство
Не просто свойство, свойство по умолчанию;)
Получатель.
Рекурсивный конструктор с глубиной и потомком.
Некоторые операторы if дляостановите конструкцию. И конечно же SetLength для создания ссылок / узлов и вызова некоторых создает в цикле for, а затем некоторое вычитание чего-то;)
Учитывая всех вас достаточно подсказокбыло бы весело и интересно посмотреть, сможет ли кто-нибудь воссоздать его, иначе я мог бы просто запатентовать его, просто шутить, не бросая денег против него, мог бы расширить класс, хотя и с другими возможностями.
Класс выделяет все узлы во время построения как настоящая структура данных ... с добавлением и удалением, и так далее, по крайней мере, пока.
Теперь наступает самый интересный и забавный аспект этого (секретного) дизайна,что-то вроде того, что я хотел, и теперьЛити.Теперь я могу написать код следующим образом:
TGroup - это просто пример, который может быть чем угодно, лишь бы это был класс в моем случае.В данном случае это просто класс с mString
var
mGroupTree : TTree<TGroup>;
procedure Main;
var
Depth : integer;
Childs : integer;
begin
Depth := 2;
Childs := 3;
mGroupTree := TTree<TGroup>.Create( Depth, Childs );
mGroupTree.Data.mString := 'Basket'; // notice how nice this root is ! ;)
mGroupTree[0].Data.mString := 'Apples';
mGroupTree[1].Data.mString := 'Oranges';
mGroupTree[2].Data.mString := 'Bananas';
mGroupTree[0][0].Data.mString := 'Bad apple';
mGroupTree[0][1].Data.mString := 'Average apple';
mGroupTree[0][2].Data.mString := 'Good apple';
mGroupTree[1][0].Data.mString := 'Tiny orange';
mGroupTree[1][1].Data.mString := 'Medium orange';
mGroupTree[1][2].Data.mString := 'Big orange';
mGroupTree[2][0].Data.mString := 'Straight banana';
mGroupTree[2][1].Data.mString := 'Curved banana';
mGroupTree[2][2].Data.mString := 'Crooked banana';
. Из этого фактического тестового кода вы можете заметить, что он допускает "расширение массива", которое я редко видел благодаря этому.свойство, которое ссылается на саму себя ...
Так что [] [] - это глубина 2. [] [] [] - это глубина 3.
Я все еще оцениваю использованиеthis.
Одна потенциальная проблема заключается в том, что у Delphi нет реальной техники для автоматического расширения этих массивов, хотя я пока не нашел и не выполнил проверку.
Я хотел бы написать технику, где я могу написатьнекоторый код, который может перейти на любой уровень глубины:
[0] [0] [0] [0] [0]
Еще не уверен, как это сделать ... опция simpelst"recursion".
real пример:
procedure DisplayString( Depth : string; ParaTree : TTree<TGroup>);
var
vIndex : integer;
begin
if ParaTree <> nil then
begin
// if ParaTree.Data.mString <> '' then
begin
writeln( ParaTree.Data.mString );
Depth := Depth + ' ';
for vIndex := 0 to ParaTree.Childs-1 do
begin
DisplayString( Depth, ParaTree[vIndex] );
end;
end;
end;
end;
Интересно, не правда ли?
Все еще изучаю его полезность для "реальных приложений"и если я хочу пойти с рекурсией или нет;)
Может быть, когда-нибудь я открою исходный код всего своего кода.Мне почти 40 лет, когда я перешагнул за 40, от 39 до 40 лет, я как бы планировал пойти с открытым исходным кодом.Еще 4 месяца до 40 = D
(Я должен сказать, что это первый раз, когда я впечатлен Generics, протестировал его давным-давно, он был супер глючным и, возможно, непригодным для дизайна, но теперь сисправленные и ограниченные ошибки дженериков, это очень впечатляет в последней версии Delphi Toyko 10.2.3 август 2018!методы, которые пишут рекурсивные процедуры для обработки этой структуры данных, могут стать немного проще, возможно, стоит рассмотреть параллельную обработку, Delphi help упоминает об этом для анонимных методов.
Пока, Skybuck.