Как преобразовать текстовые данные в дерево - PullRequest
1 голос
/ 20 сентября 2011

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

a.b.c.d.e.f.g
b.c.d.e.f.g.h.x
c.d.e.q.s.n.m.y
a.b.c

Мне нужно взять эти данные и превратить каждый уровень в узел дерева.Таким образом, дерево выглядит примерно так:

a
  b
    c
      d
        e
...
b
  c
    d
....

, если, например, на том же уровне есть другой a, элементы под ним должны быть добавлены в качестве узлов в эту ветвь.Я подумал о следующем:

  1. Разобрать каждую строку, которая квалифицируется символом точки для каждого элемента, и создать упорядоченный список.
  2. Для каждого элемента в списке добавьте его в качестве узла в текущем местоположении.
  3. Перед добавлением убедитесь, что другой элемент того же уровня не существует с таким же именем.
  4. Добавлять следующий элемент до тех пор, пока все элементы в списке не будут созданы, следующие элементы являются дочерними по отношению к первому добавленному элементу списка.

Я надеюсь, что я был ясен, и дайте мне знать, если это требует дальнейших разъяснений.

Ответы [ 3 ]

1 голос
/ 20 сентября 2011

Я предполагаю существование методов CreateRootNode и AddChildNode.

void ParseToTreeview(IEnumerable<string> data) {
    foreach (var line in data) {
        var names = line.Split('.');
        for (var i = 0; i < names.Length; i++) {
            TreeNode node = null;
            if (i == 0)
                node = CreateRootNode(name:names[i]);
            else
                node = AddChildNode(name:names[i], parentNode:node);
        }
    }
}
1 голос
/ 20 сентября 2011

Вы можете изменить класс Node, чтобы иметь проверки, если вы хотите список дочерних узлов и т. Д., Добавьте это как HashSet, чтобы вы могли легко выполнить проверку на уникальность. Добавьте метод в класс Node для создания AddChild и проверки HashSet.

public class Main
    {
        public Main()
        {
            string treeStr = "";

            string[] strArr = { "a.b.c.d.e.f.g", "b.c.d.e.f.g.h.x" };

            List<Node> nodes = new List<Node>();
            Node currentNode;

            foreach (var str in strArr)
            {
                string[] split = str.Split('.');
                currentNode = null;

                for (int i = 0; i < split.Length; i++)
                {
                    var newNode = new Node { Value = str };

                    if (currentNode != null)
                    {
                        currentNode.Child = newNode;
                    }
                    else
                    {
                        nodes.Add(newNode);
                    }

                    currentNode = newNode;
                }
            }
        }


    }

    public class Node
    {
        public string Value { get; set; }
        public Node Child { get; set; }
    }
0 голосов
/ 20 сентября 2011

Рекурсивный метод для добавления всего этого - то, что вам нужно.Вот пример:

Использование:

string[] yourListOfData = { "a.b.c.d.e.f.g", "b.c.d.e.f.g.h.x", "c.d.e.q.s.n.m.y", "a.b.c" };
foreach(string x in yourListOfData)
  PopulateTreeView(x, myTreeView.Nodes[0]);

Метод выборки:

  public void PopulateTreeView(string values, TreeNode parentNode )
  {
      string nodeValue = values;
      string additionalData = values.Substring(value.Length - (value.Length - 2));

      try
      {
         if (!string.IsNullOrEmpty(nodeValue))
         {
            TreeNode myNode = new TreeNode(nodeValue);
            parentNode.Nodes.Add(myNode);
            PopulateTreeView(additionalData, myNode);
         }
      } catch ( UnauthorizedAccessException ) {
        parentNode.Nodes.Add( "Access denied" );
      } // end catch
  }

ПРИМЕЧАНИЕ: приведенный выше код не проверен, возможно, потребуется настроить

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