【问题标题】:create java function to repeat adding object创建java函数以重复添加对象
【发布时间】:2023-04-05 14:21:01
【问题描述】:

所需的输出如下所示。让节点类在最后被序列化,以便将类转换为 json 字符串,但问题是该过程需要循环而不是硬编码。

 {"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));

节点类

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);
}

【问题讨论】:

  • 如果只存储普通对象,为什么还需要数组?

标签: java json recursion serialization jackson


【解决方案1】:

您可以添加一个使用递归的方法...

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);
}

【讨论】:

  • 我什么时候打电话?
  • 每次创建新节点时都会调用此方法,创建后只需在主节点对象上调用此方法,并使用刚刚创建的 ndoe 作为参数
  • 我在尝试使用此函数时得到了一个空指针。你能发布一个循环示例吗?
  • 所以我明白了原因,这是因为在节点的构造函数中,您从未初始化包含节点的数组。确保在构造函数的主体中初始化
【解决方案2】:

最好添加带有子节点的构造函数:

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)));
    }

你会得到你想要的。并且不要忘记添加检查叶子是否为空或空数组。

【讨论】:

    猜你喜欢
    • 2018-02-09
    • 2014-01-30
    • 2020-08-13
    • 2018-05-25
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    相关资源
    最近更新 更多