Проблемы с алгоритмом - PullRequest
1 голос
/ 02 декабря 2010

У меня есть следующие 5 строк:

A.B.C.D.E
A.B
A.B.C
A
A.B.C.D

Это иерархические отношения. Например, вторая строка означает, что B является дочерним для A.

Теперь я хочу разобрать эти строки в структуру классов. Так что каждая буква представлена ​​экземпляром класса и указывает на его родителя (или ноль, если верхний уровень (A)). Однако каждое письмо должно быть добавлено только один раз.

Я начал следующее:

    String[] hierarchical = Name.Split('.');

        if (hierarchical.Count() > 1)
        {
            Console.WriteLine("Package '" + Name + "' is not top level and has to be parsed");

            Console.WriteLine("Find parent for '" + hierarchical[hierarchical.Count() - 1] + "'");

            findParent(Name);

        }
        else
        {
            Console.WriteLine("Package '" + Name + "' is top level and is added to the manager");
            if (!manager.isAlreadyAdded(Name))
            {
                Package p = new Package(null, hierarchical[0], Name);
                manager.add(p);
            }
        }

    }

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

private void findParent(String path)
        {
            String originalPath = path;
            bool found = false;

            while (!found)
            {
                int position = path.LastIndexOf(".");

                if (position == -1)
                {
                    Console.WriteLine("Top level reached: " + path);
                    if (!manager.isAlreadyAdded(path))
                    {
                        Package p = new Package(null, path, path);
                        manager.add(p);
                    }
                    found = true;
                }
                else
                {
                    path = path.Substring(0, position);
                    Console.WriteLine("Path: " + path);

                    if (!manager.isAlreadyAdded(path))
                    {
                        Package p = new Package(null,getName(path), path);
                        manager.add(p);
                    }

                }

            }

        }

        private string getName(string path)
        {
            int position = path.LastIndexOf(".");
            if (position == -1)
            {
                return path;
            }
            else
            {
                return path.Substring(position+1, path.Length - position - 1);
            }
        }

Как и ожидалось, это работает не так, как я хотел, так как добавляет все пакеты в качестве верхних уровней. Как я могу это исправить?

Ответы [ 2 ]

2 голосов
/ 03 декабря 2010

Является ли первый аргумент конструктора пакета случайно родителем? Если это так, вы всегда пропускаете ноль, что может быть вашей проблемой.

Кстати, я думаю, вы сможете упростить свой алгоритм.

Не могу что-то вроде этой работы:

String[] hierarchical = Name.Split('.');
foreach (String node in hierarchical){
 if(!manager.Contains(node)){
      manager.AddToEnd(node); //adds node who's parent is the last node added

  }

}

Поскольку каждая строка гарантированно "отсортирована", вы знаете, что если вы получаете пакет, который еще не был добавлен, то его родительский элемент - это последний добавленный узел.

0 голосов
/ 03 декабря 2010

Мне немного непонятно, что вы пытаетесь сделать, но это установит parent от второй до последней записи (узла) в списке:

        string[] nodes = path.Split(".".ToCharArray());
        string parent = nodes[nodes.Length - 2];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...