2016-11-10 2 views
0

У меня есть интересная и, как я понимаю, не самая простая задача.Дерево объектов java на основе списка строк, представляющих иерархию

Мне нужно создать дерево объектов на основе списка строк, представляющих иерархию.

Например, строки в списке (на самом деле это может быть любой график):

List<String> hierarchies; 

1 # 1 # 2 # 1 # 2 # 3 # 1 # 2 # 4 # 1 # 2 # 4 # 5 #

Класс у меня есть:

class Tree { 

    List<Tree> children; 

    // here is getter 

} 

у меня есть реализация, но только для начала. Я не знаю, как закончить этот код. Можете ли вы поделиться своим видением со мной?

Заранее благодарен!

Tree tree = null; 

for (String hierarchy : hierarchies) { 

    if (hierarchy.equals("1#")) { 
     tree = new Tree(); 
    } else { 
     tree.getChildren().add(new Tree()); 
    } 

} 

return tree; 
+1

Вы можете нарисовать изображение (в искусстве ASCII), как должно выглядеть дерево, учитывая введенный вами пример ввода? – martijnn2008

ответ

0

Существует множество возможных решений. Без какой-либо сложности это может выглядеть так:

public void testHierarchy() { 

    List<String> hierarchies = new ArrayList<String>(); 

    hierarchies.add("1#"); 
    hierarchies.add("1#2#"); 
    hierarchies.add("1#2#3#"); 
    hierarchies.add("1#2#4#"); 
    hierarchies.add("1#2#4#5#"); 

    Tree root = new Tree(); 
    for (String hierarchy : hierarchies) { 
     String[] elHierarchy = hierarchy.split("#"); 
     processLevel(elHierarchy, root); 
    } 
} 

private void processLevel(String[] hierarchy, Tree rootTree) { 

    if (null == rootTree.getValue() || "".equals(rootTree.getValue())) { 
     rootTree.setValue(hierarchy[0]); 
    } 

    Tree nextChild = null; 
    for (Tree child : rootTree.getChildren()) { 
     if (child.getValue().equals(hierarchy[1])) { 
      nextChild = child; 
      break; 
     } 
    } 

    if (hierarchy.length > 1) { 
     if (null == nextChild) { 
      nextChild = new Tree(); 
      nextChild.setValue(hierarchy[1]); 
      rootTree.getChildren().add(nextChild); 
     } 
     String[] remainHierarchy = new String[hierarchy.length - 1]; 
     System.arraycopy(hierarchy, 1, remainHierarchy, 0, remainHierarchy.length); 
     processLevel(remainHierarchy, nextChild); 
    } 
} 

private static class Tree { 
    String value; 
    List<Tree> children = new ArrayList<SometestTest.Tree>(); 

    public List<Tree> getChildren() { 

     return children; 
    } 

    public String getValue() { 

     return value; 
    } 

    public void setValue(String value) { 

     this.value = value; 
    } 

} 

P.S. Не слишком элегантный, но простой.

+0

Вадим, это действительно помогло. Большое спасибо! –

+0

Вы всегда приветствуете – Vadim