2010-12-02 2 views
1

У меня есть следующие 5 строк строки:Проблемы с алгоритмом

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

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

Теперь я хочу проанализировать эти строки в структуре классов. Чтобы каждая буква была представлена ​​экземпляром класса и указывала на его родительский элемент (или null, если верхний уровень (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); 
      } 
     } 

    } 

Это означает, что, если это имя верхнего уровня (А в приведенном выше примере), а затем добавить его к менеджеру, если он уже не существует. Проблема заключается в методе 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); 
      } 
     } 

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

+1

Ваш пример описывает только 1 структуру с 5 членов. Или вы имеете в виду (независимую) структуру на строку? – 2010-12-02 21:05:37

+0

Прошу прощения, я объяснил это. Одна строка - одна структура. – 2010-12-02 21:06:54

ответ

2

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

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

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

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

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

 string[] nodes = path.Split(".".ToCharArray()); 
     string parent = nodes[nodes.Length - 2]; 
Смежные вопросы