Java 将树转为List

1、需求,将一棵无关联属性的树(没有id和pid)转化为list存储(通过id和pid关联)

2、思路,该处只能通过广度遍历树获取list。如果使用深度遍历的话,pid将获取不到正确的值。

3、树的结构如下。(无id和pid)

public class Tree {
    private String name;
    private List children;
}

为了方便起见,使用Map对象构建(可以通过com.alibaba.fastjson.JSONObject)工具类将对象转化为Map    

import java.util.*;
import com.alibaba.fastjson.JSONObject;

public static void main(String[] args) {
        //将树转化为Map结构
        String result = Tree.toString();//抽象写法,先将树转为String
        JSONObject jsonObject = JSONObject.parseObject(result);
        //获取Map形式的数据。
        Map objectMap = JSONObject.toJavaObject(jsonObject, Map.class);
        //该处需要给该树的根节点添加id和pid(例如id=UUID.randomUUID().toString(),pid=0)
        objectMap.put("pid", "0");
        objectMap.put("id", UUID.randomUUID().toString());
        //广度遍历解析树
        List> platList = breadthFirst(objectMap);
        for (Map plat : platList) {
            System.out.println(plat.toString());
        }
   }
/***
 * 树转化为List 广度优先遍历
 * @param root
 * @return
 */
public static List> breadthFirst(Map root) {
    List> lists = new ArrayList<>();
    if (root == null) {
        return lists;
    }
    Queue> queue = new LinkedList<>();
    queue.offer(root);
    while (!queue.isEmpty()) {
        Map tree = queue.poll();
        String pid = (String) tree.get("id");
        List> children = (List>) tree.get("children");
        for (Map child : children) {
            child.put("pid", pid);
            child.put("id", UUID.randomUUID().toString());
            queue.offer(child);
        }
        Map plat = new HashMap<>();
        plat.put("name", tree.get("name"));
        plat.put("pid", tree.get("pid"));
        plat.put("id", tree.get("id"));
        lists.add(plat);
    }
    return lists;
}

至此转化完成。

你可能感兴趣的:(广度遍历,tree,list,java)