2016-11-23 2 views
1

У меня есть файл excel с двумя столбцами. Первая колонка (A) имеет родителей, а вторая имеет детей (B). Строка содержит информацию, каков родительский элемент дочернего элемента.Построить многоуровневый массив из одной таблицы отношений

Parent | Child 
1  | 2 
1  | 4 
1  | 6 
2  | 3 
4  | 2 
4  | 3 
3  | 5 

Теперь я хочу построить многоуровневый массив, имеющий структуру дерева д. Я хочу добиться того, что позже я хочу дать родителям (например, 2) и получить список уровней и детей и их уровень. Глобальная цель должна быть: я хочу знать, если я переведу двух родителей верхнего уровня, есть ли у них похожие дети? Это должно быть возможно с любого уровня.

+0

Пункт 1 имеет пункт 2 в качестве ребенка. Пункт 2 имеет пункт 1 в качестве ребенка. Пункт 2 сам по себе является дочерним, это не древовидная структура. –

+0

BTW: множественное число детей - это дети. Если бы английское правописание было последовательным, как бы нам было трудно учиться. Что значит: «Я хочу знать, если я переведу двух родителей верхнего уровня, есть ли у них похожие дети? Это должно быть возможно с любого уровня». Какое отношение имеет отношение к подобным детям? Как примирить «верхний уровень» и «любой уровень»? –

+1

Согласен с @TonyDallimore. Не могу понять, чего вы хотите достичь. Возможно, изображение желаемого результата поможет. – CMArg

ответ

0

Вы не даете достаточно информации о своем требовании, чтобы дать окончательный ответ, поэтому вот несколько идей.

Моя первая попытка в структуре будет:

| Parents | Children | 
1 | 2  | 2 4 6 | 
2 | 1 2 4 | 1 2 3 | 
3 | 2 4 | 5  | 
4 | 1  | 2 3  | 
5 | 3  |   | 
6 | 1  |   | 

То есть, для каждого из элементов, я бы список родителей и список детей. Я бы рассмотрел усилия по созданию этой структуры и рассмотрел, как легко я мог бы ответить на требуемые вопросы из этой структуры. Это не сложная структура для сборки вручную, поэтому не должно быть сложной структуры для макроса для сборки. Вы хотите знать, есть ли у двух предметов одинаковые дети. Это можно быстро определить, просмотрев списки детей для двух предметов.

Вам понадобится полный обзор против ваших запланированных видов использования для этой структуры. Однако на данный момент эта структура выглядит удовлетворительной.

В вашей таблице идентификаторами элементов являются номера от 1 до 6 без пробелов. Если это представитель реальных данных, я бы, вероятно, определить тип пользователя и хранить данные в виде массива:

Type utItem 
    Parents() As Long 
    Children() as Long 
End Type 

Dim Items() as utItem 

Если реальные идентификаторы строк или рассеянные числа, я считаю, что я хотел бы пойти на словарь. Для каждой записи ключ будет идентификатором, и элемент будет представлять собой пару массивов: один для родителей и один для детей.

Предложение 2

Дополнительная информация предполагает структуру, как это то, что вам требуется:

Prnt | D?| Children 
ABC | | BBC BBD FGI FGJ KLM 
STU | D | BBC BBD FGI FGJ KLM 
GHI | D | BBC BBD FGI FGJ KLM 
ABD | | BBC FGJ 
FGH | D | BBC FGI FGJ KLM 
ABE | | BBC FGI FGJ KLM 

Три идентификаторы письма представляют собой имя файла. Реальные имена файлов будут длиннее, но это не имеет значения.

Для каждого родителя, дети указаны в алфавитном порядке. Затем список был отсортирован по идентификаторам детей, причем последовательность родителей была неважной. Например, STU и GHI имеют одинаковых детей. Если список был отсортирован дочерними элементами, то родитель, строка GHI будет первой. Если это важно для первой строки GHI, вам необходимо добавить это требование.

A D во втором столбце указывает, что строка имеет те же самые дети, что и предыдущая строка.

В этом списке нет ничего, чтобы указать, имеет ли, например, ABC свой родитель или родитель. Такая информация может быть полезна при создании этого списка, но она не нужна после завершения списка.

Вы хотите загрузить эти данные в систему PDM.Вы можете добавить элемент ABC и его детей в систему PDM, но вы не можете добавить STU, потому что у него одни и те же дети. Я не понимаю. Вы не можете просто игнорировать элемент STU, потому что у него могут быть родители, которые будут ссылаться на него.

Загрузка данных в систему PDM будет одноразовой нагрузкой. Создание вышеуказанной структуры не может быть невероятно медленным, но не должно быть молниеносно. Например, пять минут могут быть прекрасными, сорок пять минут будут приемлемыми, но двадцать часов не будут приемлемыми.

+0

Эй, настоящие идентификаторы - это строки (имена файлов), а список - список из 337 000 строк, и в результате получившийся список словаря/массива/списка может содержать до 15 уровней. – PhilHar

+0

Ваша помощь поразительна. Мне нужно объяснить «равные дети» более конкретным: если ABC имеет KLM в качестве ребенка (на уровне 4), а FGH имеет KLM в качестве дочернего (на уровне 3), у них есть равный ребенок и не может быть импортирован. Структура не обязательно должна быть одинаковой. Если минимум один ребенок равен, две сборки не могут быть импортированы одновременно. Чтобы понять, почему: Если вы одновременно импортируете два равных файла, какой из них правильный? Процедура импорта завершается с ошибкой. Сначала нужно импортировать, второй следует использовать из системы PDM в качестве единственного источника правды. – PhilHar

+0

Вам нужно будет добавить гораздо больше информации в свой вопрос, если я буду понимать ваши требования и предлагаю конструктивный совет. В вашем примере данные 1 - это ребенок 2 и 2 - ребенок 1 и 2. Какие предметы в реальном мире делают 1 и 2? 2 - это ребенок из 1, 2 и 4. Если вы можете импортировать 2 только как один компонент, из которых 1, 2 и 4 вы импортируете? Что произойдет с двумя другими родителями? Импорт 1 в качестве конечного родителя кажется разумным, но если вы не можете импортировать двух своих детей, как это возможно? –

Смежные вопросы