Дерево в Go ссылается на идентификатор отца - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь создать дерево в Go, но у меня небольшая проблема с созданием этого дерева, я получаю от .txt неупорядоченные имена:

SESSION01.5
SESSION01
SESSION02.5
SESSION01.5.5
SESSION02

Это должно быть:

SESSION01 -> SESSION01.5 -> SESSION01.5.5
SESSION02 -> SESSION02.5

Я хочу добавить в базу данных, потому что мне нужно, чтобы идентификатор отца был задан в моей структуре Session как:

type Session struct {
  ID *int64
  Name *string
  SessionFatherID *int64
}

Есть идеи, как создать это дерево?

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Вопрос, вам нужна ссылка на структуру Session. Было бы лучше, если бы было написано:

type Session struct {
   ID int64
   Name string
   SessionFatherID int64
}

Самое простое, что можно сделать, это прочитать это в карту с ключом Name, а затем сделать второй проход, чтобы связать SessionFatherID ( aka parent ID).

Так как это похоже на домашнюю работу, я избегу "написать решение для вас". Ваша программа должна выглядеть следующим образом:

Шаг 1: Открыть входной файл

Шаг 2: Сканировать входной файл в карту сессий: sessions := map[string]*Session{}

entry := Session{ID: id, Name: name}
session[entry.Name] = &entry

Шаг 3. Перебор сеансов

  • Анализ имени сеанса для определения его родителя
  • Поиск на карте родительского элемента и его идентификатора
  • Установить запись, имеющая новый SessionFatherID

     if parent, found := sessions[parentSessionName]; found {
            value.SessionFatherID = parent.ID
     }
    
  • Это работает, поскольку карта указателя на сессию, вы можете изменить значение

Шаг 4: Выведите ваш результат

Простой результат для вашего набора данных может выглядеть следующим образом:

&{1 SESSION01 0}
&{2 SESSION02.5 4}
&{3 SESSION01.5.5 0}
&{4 SESSION02 0}
&{0 SESSION01.5 1}
0 голосов
/ 27 апреля 2020

Вам, вероятно, понадобится сделать это как многопроходную операцию. На первом этапе прочитайте все имена ваших сеансов и создайте структуру Session с указателями nil для идентификатора ID и родительского идентификатора. Также добавьте их в map[string]*Session (наберите имя). Вам также понадобится функция «имя родительского сеанса из имени сеанса» (которая, судя по данным вашего примера, будет «если есть какие-либо точки, отбросьте последнюю точку и все, что после»).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...