[算法篇]根据文本逐行解析来生产树状结构

109 阅读1分钟
package com.flyby.center.hotel.model.threadLocal;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.ArrayList;
import java.util.List;

public class Node2 {



    static String t = "[\n" +
            "    {\n" +
            "        "name":"主标题A",\n" +
            "        "level":0\n" +
            "    },\n" +
            "    {\n" +
            "        "name":"副标题A1",\n" +
            "        "level":1\n" +
            "    },\n" +
            "    {\n" +
            "        "name":"次副标题A11",\n" +
            "        "level":2\n" +
            "    },\n" +
            "    {\n" +
            "        "name":"副标题A2",\n" +
            "        "level":1\n" +
            "    },\n" +
            "    {\n" +
            "        "name":"副标题A3",\n" +
            "        "level":1\n" +
            "    },\n" +
            "    {\n" +
            "        "name":"主标题B",\n" +
            "        "level":0\n" +
            "    },\n" +
            "    {\n" +
            "        "name":"副标题B1",\n" +
            "        "level":1\n" +
            "    }\n" +
            "]";

    public static void main(String[] args) {
        tree();
    }

    static class Node{
        public Integer level;
        public transient Node parent;
        public List<Node> subNodes;
        public String name;
        public Node(Integer level, String name){
            this.level = level;
            this.name = name;
        }
    }

    private static Node findParent(Node temp, Node self) {
//        if(temp == null||temp.parent ==null) return null;
//        for (temp = temp.parent; temp.level<self.level;){
//            System.out.println("wwwww");
//            return temp;
//        }
//        return null;
        while (true) {
            if(temp == null)
                return null;
            if (temp.level + 1 == self.level)
                return temp;
            else
                temp = findParent(temp.parent, self);
        }
    }

    public static void tree(){
        List<Node> nodeList = new ArrayList<>();
        JSONArray objects = JSON.parseArray(t);
        Node commonParent = null;
        Node preNode =null;
        for (int i = 0; i < objects.size(); i++) {
            JSONObject object = objects.getJSONObject(i);
            Node node = new Node(object.getInteger("level"), object.getString("name"));
            if(node.level==0) {
                nodeList.add(node);
            }
            if(preNode!=null){
                if (node.level < preNode.level)
                    commonParent = findParent(preNode, node);
                else if(node.level==preNode.level)
                    commonParent = preNode.parent;
                else if(node.level==preNode.level+1)
                    commonParent = preNode;
            }
            if(commonParent!=null) {
                node.parent = commonParent ;
                List<Node> subNodes = commonParent.subNodes;
                if (subNodes == null)
                    commonParent.subNodes  = new ArrayList<>();
                commonParent.subNodes.add(node);
            }
            preNode = node;
        }
        System.out.println(JSON.toJSONString(nodeList, true));
    }
}

这类适用于比如外部导入文本文件,没有标识id, 比较松散的数据结构处理.