2016-10-11 2 views
2

Желаемый результат должен быть следующим. Узел класса, который сериализуется в конце, превратит класс в строку json для меня, однако проблема заключается в том, что процесс должен быть закодирован, а не жестко закодирован.создать функцию java для повторного добавления объекта

{"name":"Main","nodes":[{"name":"Tree","nodes":[{"name":"Branch","nodes":[{"name":"Stick","nodes":[{"name":"Leaf"}]}]}]}]} 

Я пытаюсь выполнить этот процесс, чтобы я не вручную добавлял все объекты друг в друга.

Node mainNode = new Node(); 
    mainNode.setName("Main"); 
    String directory = "Tree/Branch/Stick/Leaf"; 
    Node n1 = new Node(); 
    n1.setName("Tree"); 
    Node n2 = new Node(); 
    n2.setName("Branch"); 
    Node n3 = new Node(); 
    n3.setName("Stick"); 
    Node n4 = new Node(); 
    n4.setName("Leaf"); 

    n3.addNode(n4); 
    n2.addNode(n3); 
    n1.addNode(n2); 
    mainNode.addNode(n1); 

    Gson gson = new Gson(); 
    logger.info(gson.toJson(mainNode)); 

класс Node

public class Node { 
    public String name; 
    public Node[] nodes; 

    public Node(){} 
    public Node(String name){ 
     this.name = name; 
    } 
public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
public Node[] getNodes() { 
    return nodes; 
} 
public void setNodes(Node[] nodes) { 
    this.nodes = nodes; 
} 
public void addNode(Node node){ 
    this.nodes = (Node[]) ArrayUtils.add(this.nodes, node); 
} 
+0

Зачем вам нужен массив внутри, если вы храните только простой объект? – eg04lt3r

ответ

1

Лучше добавить конструктора с детским кивком е:

Node(String name, Node child) { 
    this.name = name; 
    if (child != null) { 
     addChild(child); 
    } 
} 

и определить статический метод рекурсивного:

public static Node getNodeTree(String[] leaves) { 
     if (leaves.length == 1) { 
      return new Node(leaves[0]); 
     } 

     return new Node(leaves[0], getNodeTree(Arrays.copyOfRange(leaves, 1, leaves.length))); 
    } 

И вы получите то, что вы хотите. И не забудьте добавить проверку, если листья имеют пустой или пустой массив.

0

Вы можете добавить метод, который использует рекурсию ...

public void addNodeToEnd(Node newNode) 
{ 
    if(this.getNodes().length == 0) 
    { 
     this.addNode(newNode); 
    } 
    else 
    { 
     this.getNodes()[this.getNodes().length - 1].addNodeToEnd(newNode); 
    } 
} 

//make sure you initialize your array of nodes 
public Node(String name) 
{ 
    this.name = name; 
    this.nodes = new Node[1]; //or however many you want to store 
} 

здесь петлю можно использовать после создания вашего главного узла

String[] names = directory.split("/"); 

for(int i = 0; i < names.length; i++) 
{ 
    Node temp = new Node(names[i]); 
    mainNode.addNode(temp); 
} 
+0

Когда я это называю? –

+0

, вы будете называть это каждый раз, когда вы создаете новый узел, после создания просто вызовите этот метод на свой основной объект узла с помощью ndoe, который вы только что создали, поскольку это параметр –

+0

. При попытке использовать эту функцию я получил нулевой указатель. Можете ли вы опубликовать пример цикла? –