将层级结构的文本转换为json数据

问题描述

结构a
>>结构b1
>>>>结构c1
>>>>>>结构d1
>>>>>>>>结构e1
>>>>>>>>>>结构f1
>>>>>>>>>>结构f2
>>>>>>>>>>结构f3
>>>>>>>>>>结构f4
>>>>结构c2
>>>>>>结构d2
>>>>>>结构d3
>>>>>>结构d4
>>>>结构c2
>>结构b2

将类似这种以“>>”为层级标志的文本转换为json格式数据

{
    "levelIndex":0,
    "content":"结构a",
    "childList":[
        {
            "levelIndex":1,
            "content":"结构b1",
            "childList":[
                {
                    "levelIndex":2,
                    "content":"结构c1",
                    "childList":[
                        {
                            "levelIndex":3,
                            "content":"结构d1",
                            "childList":[
                                {
                                    "levelIndex":4,
                                    "content":"结构e1",
                                    "childList":[
                                        {
                                            "levelIndex":5,
                                            "content":"结构f1",
                                            "childList":[

                                            ]
                                        },
                                        {
                                            "levelIndex":5,
                                            "content":"结构f2",
                                            "childList":[

                                            ]
                                        },
                                        {
                                            "levelIndex":5,
                                            "content":"结构f3",
                                            "childList":[

                                            ]
                                        },
                                        {
                                            "levelIndex":5,
                                            "content":"结构f4",
                                            "childList":[

                                            ]
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                },
                {
                    "levelIndex":2,
                    "content":"结构c2",
                    "childList":[
                        {
                            "levelIndex":3,
                            "content":"结构d2",
                            "childList":[

                            ]
                        },
                        {
                            "levelIndex":3,
                            "content":"结构d3",
                            "childList":[

                            ]
                        },
                        {
                            "levelIndex":3,
                            "content":"结构d4",
                            "childList":[

                            ]
                        }
                    ]
                },
                {
                    "levelIndex":2,
                    "content":"结构c2",
                    "childList":[

                    ]
                }
            ]
        },
        {
            "levelIndex":1,
            "content":"结构b2",
            "childList":[

            ]
        }
    ]
}

思路分析

以自底向上的方式,先对最后一行的子节点向上进行遍历,遍历过程中依次寻找其父亲,直到最后的父节点遍历完。

需要用到的工具:

		
            com.alibaba
            fastjson
            1.2.4
        

实现代码

public class ReadFile {

    /**
     * 将list中的文本内同存进resultNode中并转换为json格式
     * @param list
     * @return
     */
    public static String contentToJson(List list) {

        //resultNode存放得到的父节点
        TextNode resultNode = new TextNode();
        //创建一个allList列表逆序存放每一个节点
        List allList = new ArrayList();

        //自底向上从最后一行开始遍历
        for (int i = list.size() - 1; i >= 0; i--) {
            //存放节点中的List属性
            List nowList = new ArrayList();
            //当前节点
            TextNode textNode = new TextNode();
            //默认当前为第0层
            textNode.setLevelIndex(0);

            //遍历到最后一个节点。就是需要的父节点
            if (i == 0) {
                resultNode = textNode;
                resultNode.setContent(list.get(i));
            }

            //判断当前节点的层级,每存在一个>>为一级
            for (int begin=0,end=2; list.get(i).substring(begin, end).equals(">>"); begin += 2, end += 2) {
                textNode.setLevelIndex(end/2);
                textNode.setContent(list.get(i).substring(end));
            }

            //判断节点的父子关系,第一个进来的节点为子节点且没有儿子,所以第一个无需判断
            if (i != list.size()-1) {
                //已经遍历过的节点存放在allList中,且与list的顺序相反。
                //此处j是除当前节点外,已经存放在allList中的节点个数-1
                for (int j = list.size() - i - 2; j >= 0; j--) {
                    //如果节点的层级比期上一个节点大,则当前节点无子节点
                    if (textNode.getLevelIndex() - allList.get(j).getLevelIndex() >= 0) {
                        break;
                    }
                    //临近节点中比当前节点层级多1的都是当前节点的子节点
                    if (textNode.getLevelIndex() - allList.get(j).getLevelIndex() == -1) {
                        nowList.add(allList.get(j));
                    }
                }
            }
            textNode.setChildList(nowList);
            allList.add(textNode);
        }
        return JSON.toJSONString(resultNode);
    }


    public static void main(String[] arg){

        //读取文档内容到list
        String filePath = "D:\\Files\\Desktop\\test1.txt";
        List list = readTxtFile(filePath);

        //把list放入textNode并转换为json字符串
        String result = contentToJson(list);
        System.out.println(result);
    }
}

你可能感兴趣的:(小工具,格式转换,算法,动态规划,java)