• 多级菜单 树结构 排序 前端 后端 java


    目录

    省流:

    正文: 

    v1.0版 

    前端传的值:

    后端代码:

    v2.0版

    v3.0版


    省流:

    前端提交过来整个树即可。 

    给整个树进行sort。代码如下:

    1. public static void sort(List tree){
    2. int i = 0;
    3. for (Node o : tree) {
    4. o.setSort(i++);
    5. if(o.getChild()!=null){
    6. sort(o.getChild());
    7. }
    8. }
    9. }

    这个只是单纯排序,没有替换parentId。升级版本见正文。

    排序完以后,结果如下:

    一级节点的sort:1,2,3,4...

    二级节点的sort:每个一级节点下的二级节点,都会从1开始排序:1,2,3,4...

    1. |-- 一级节点1
    2. |--二级节点1
    3. |--二级节点2
    4. |--二级节点3
    5. |-- 一级节点2
    6. |--二级节点1
    7. |--二级节点2
    8. |--二级节点3
    9. |-- 一级节点3
    10. |--二级节点1
    11. |--二级节点2
    12. |--二级节点3

     

    正文: 

     

    v1.0版 

    前端传的值:

    1. {
    2. "id": "雪花id",
    3. "parentId": "雪花id",
    4. "name":"书籍",
    5. "sort":"1",
    6. "children": [
    7. {
    8. "id": "雪花id",
    9. "parentId": "雪花id",
    10. "name": "数学",
    11. "sort": 1,
    12. "children": [
    13. {
    14. "children": [],
    15. "id": "雪花id",
    16. "parentId": "雪花id",
    17. "name": "几何学",
    18. "sort": 1,
    19. },
    20. {
    21. "children": [],
    22. "id": "雪花id",
    23. "parentId": "雪花id",
    24. "name": "代数学",
    25. "sort": 2,
    26. },
    27. {
    28. "children": [],
    29. "id": "雪花id",
    30. "parentId": "雪花id",
    31. "name": "概率学",
    32. "sort": 3,
    33. }
    34. ]
    35. },
    36. {
    37. "id": "雪花id",
    38. "parentId": "雪花id",
    39. "name": "物理",
    40. "sort": 2,
    41. "children": [
    42. {
    43. "children": [],
    44. "id": "雪花id",
    45. "parentId": "雪花id",
    46. "name": "光学",
    47. "sort": 1,
    48. },
    49. {
    50. "children": [],
    51. "id": "雪花id",
    52. "parentId": "雪花id",
    53. "name": "力学",
    54. "sort": 2,
    55. },
    56. {
    57. "children": [],
    58. "id": "雪花id",
    59. "parentId": "雪花id",
    60. "name": "量子学",
    61. "sort": 3,
    62. }
    63. ]
    64. },
    65. {
    66. "id": "雪花id",
    67. "parentId": "雪花id",
    68. "name": "化学",
    69. "sort": 3,
    70. "children": [
    71. {
    72. "children": [],
    73. "id": "雪花id",
    74. "parentId": "雪花id",
    75. "name": "有机学",
    76. "sort": 1,
    77. },
    78. {
    79. "children": [],
    80. "id": "雪花id",
    81. "parentId": "雪花id",
    82. "name": "无机学",
    83. "sort": 2,
    84. },
    85. {
    86. "children": [],
    87. "id": "雪花id",
    88. "parentId": "雪花id",
    89. "name": "应用化学",
    90. "sort": 3,
    91. }
    92. ]
    93. }
    94. ]
    95. }

    后端代码:

    后端模拟前端传值单元测试: 

    1. import java.util.ArrayList;
    2. import java.util.Arrays;
    3. import java.util.List;
    4. public class SortT1 {
    5. public static void main(String[] args) {
    6. //一级节点
    7. Node firstNode1 = new Node();
    8. Node firstNode2 = new Node();
    9. Node firstNode3 = new Node();
    10. List first = new ArrayList<>(Arrays.asList(firstNode1,firstNode2,firstNode3));
    11. //二级节点
    12. Node sec1First1 = new Node();
    13. Node sec2First1 = new Node();
    14. Node sec3First1 = new Node();
    15. List second1 = new ArrayList<>(Arrays.asList(sec1First1,sec2First1,sec3First1));
    16. firstNode1.setChild(second1);
    17. Node sec1First2 = new Node();
    18. Node sec2First2 = new Node();
    19. Node sec3First2 = new Node();
    20. List second2 = new ArrayList<>(Arrays.asList(sec1First2,sec2First2,sec3First2));
    21. firstNode2.setChild(second2);
    22. Node sec1First3 = new Node();
    23. Node sec2First3 = new Node();
    24. Node sec3First3 = new Node();
    25. List second3 = new ArrayList<>(Arrays.asList(sec1First3,sec2First3,sec3First3));
    26. firstNode3.setChild(second3);
    27. sort(first);
    28. System.out.println(first);
    29. }
    30. public static void sort(List tree){
    31. int i = 0;
    32. for (Node o : tree) {
    33. o.setSort(i++);
    34. if(o.getChild()!=null){
    35. sort(o.getChild());
    36. }
    37. }
    38. }
    39. }

     

    1. import java.util.List;
    2. public class Node {
    3. private Integer sort;
    4. private List child;
    5. public Integer getSort() {
    6. return sort;
    7. }
    8. public void setSort(Integer sort) {
    9. this.sort = sort;
    10. }
    11. public List getChild() {
    12. return child;
    13. }
    14. public void setChild(List child) {
    15. this.child = child;
    16. }
    17. }

    v2.0版

    增加parentId

    1. public static void main(String[] args) {
    2. //一级节点
    3. Node firstNode1 = new Node("0001");
    4. Node firstNode2 = new Node("0002");
    5. Node firstNode3 = new Node("0003");
    6. List first = new ArrayList<>(Arrays.asList(firstNode1,firstNode2,firstNode3));
    7. //二级节点
    8. Node sec1First1 = new Node("00010001");
    9. Node sec2First1 = new Node("00010002");
    10. Node sec3First1 = new Node("00010003");
    11. List second1 = new ArrayList<>(Arrays.asList(sec1First1,sec2First1,sec3First1));
    12. firstNode1.setChild(second1);
    13. Node sec1First2 = new Node("00020001");
    14. Node sec2First2 = new Node("00020002");
    15. Node sec3First2 = new Node("00020003");
    16. List second2 = new ArrayList<>(Arrays.asList(sec1First2,sec2First2,sec3First2));
    17. firstNode2.setChild(second2);
    18. Node sec1First3 = new Node("00030001");
    19. Node sec2First3 = new Node("00030002");
    20. Node sec3First3 = new Node("00030003");
    21. List second3 = new ArrayList<>(Arrays.asList(sec1First3,sec2First3,sec3First3));
    22. firstNode3.setChild(second3);
    23. sort(first, "0");
    24. System.out.println(first);
    25. }
    26. public static void sort(List tree,String parentId){
    27. int i = 0;
    28. for (Node o : tree) {
    29. o.setSort(i++);
    30. o.setParentId(parentId);
    31. if(o.getChild()!=null){
    32. sort(o.getChild(),o.getId());
    33. }
    34. }
    35. }
    1. public class Node {
    2. public Node(String id){
    3. this.id = id;
    4. }
    5. private Integer sort;
    6. private List child;
    7. private String id;
    8. private String parentId;
    9. //省略了get set方法没写,自己测的时候记得加上
    10. }

    v3.0版

     保存到数据库:将所有节点都放到一个list里。

    1. public static void main(String[] args) {
    2. //省略前面的代码
    3. //...
    4. List result = new ArrayList<>();
    5. sort(first, "0", result);
    6. //将结果集保存到数据库
    7. xxxMapper.saveOrUpdate(result);
    8. }
    9. public static void sort(List tree,String parentId,List result){
    10. int i = 0;
    11. for (Node o : tree) {
    12. o.setSort(i++);
    13. o.setParentId(parentId);
    14. if(o.getChild()!=null){
    15. sort(o.getChild(),o.getId(),result);
    16. }
    17. o.setChild(null);//递归走出来后就不需要child了
    18. result.add(o);//将当前节点存到结果集里
    19. }
    20. }

    注意:为了避免意外发生,生产上记得加上深度,以防万一出现死循环导致栈溢出stackoverflow。

     

    ===================分割线===================

    文章到此已经结束,以下是紫薯布丁

    |-- 一级节点1
        |--二级节点1
        |--二级节点2
        |--二级节点3
    |-- 一级节点2
        |--二级节点1
        |--二级节点2
        |--二级节点3
    |-- 一级节点3
        |--二级节点1
        |--二级节点2
        |--二级节点3

    {
        "id": "雪花id",
        "parentId": "雪花id",
        "name":"书籍",
        "sort":"1",
        "children": [
            {
                "id": "雪花id",
                "parentId": "雪花id",
                "name": "数学",
                "sort": 1,
                "children": [
                    {
                        "children": [],
                        "id": "雪花id",
                        "parentId": "雪花id",
                        "name": "几何学",
                        "sort": 1,

                    },
                    {
                        "children": [],
                        "id": "雪花id",
                        "parentId": "雪花id",
                        "name": "代数学",
                        "sort": 2,
                    },
                    {
                        "children": [],
                        "id": "雪花id",
                        "parentId": "雪花id",
                        "name": "概率学",
                        "sort": 3,
                    }
                ]

            },
            {
                "id": "雪花id",
                "parentId": "雪花id",
                "name": "物理",
                "sort": 2,
                "children": [
                    {
                        "children": [],
                        "id": "雪花id",
                        "parentId": "雪花id",
                        "name": "光学",
                        "sort": 1,

                    },
                    {
                        "children": [],
                        "id": "雪花id",
                        "parentId": "雪花id",
                        "name": "力学",
                        "sort": 2,
                    },
                    {
                        "children": [],
                        "id": "雪花id",
                        "parentId": "雪花id",
                        "name": "量子学",
                        "sort": 3,
                    }
                ]
            },
            {
                "id": "雪花id",
                "parentId": "雪花id",
                "name": "化学",
                "sort": 3,
                "children": [
                    {
                        "children": [],
                        "id": "雪花id",
                        "parentId": "雪花id",
                        "name": "有机学",
                        "sort": 1,

                    },
                    {
                        "children": [],
                        "id": "雪花id",
                        "parentId": "雪花id",
                        "name": "无机学",
                        "sort": 2,
                    },
                    {
                        "children": [],
                        "id": "雪花id",
                        "parentId": "雪花id",
                        "name": "应用化学",
                        "sort": 3,
                    }
                ]
            }
        ]
    }

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

    public class SortT1 {
        public static void main(String[] args) {
            //一级节点
            Node firstNode1 = new Node();
            Node firstNode2 = new Node();
            Node firstNode3 = new Node();
            List first = new ArrayList<>(Arrays.asList(firstNode1,firstNode2,firstNode3));

            //二级节点
            Node sec1First1 = new Node();
            Node sec2First1 = new Node();
            Node sec3First1 = new Node();
            List second1 = new ArrayList<>(Arrays.asList(sec1First1,sec2First1,sec3First1));
            firstNode1.setChild(second1);

            Node sec1First2 = new Node();
            Node sec2First2 = new Node();
            Node sec3First2 = new Node();
            List second2 = new ArrayList<>(Arrays.asList(sec1First2,sec2First2,sec3First2));
            firstNode2.setChild(second2);

            Node sec1First3 = new Node();
            Node sec2First3 = new Node();
            Node sec3First3 = new Node();
            List second3 = new ArrayList<>(Arrays.asList(sec1First3,sec2First3,sec3First3));
            firstNode3.setChild(second3);

            sort(first);

            System.out.println(first);
        }

        public static void sort(List tree){
            int i = 0;
            for (Node o : tree) {
                o.setSort(i++);
                if(o.getChild()!=null){
                    sort(o.getChild());
                }
            }
        }
    }
     

        public static void main(String[] args) {
            List result = new ArrayList<>();
            sort(first, "0", result);
            //将结果集保存到数据库
            xxxMapper.saveOrUpdate(result);
        }

        public static void sort(List tree,String parentId,List result){
            int i = 0;
            for (Node o : tree) {
                o.setSort(i++);
                o.setParentId(parentId);
                if(o.getChild()!=null){
                    sort(o.getChild(),o.getId(),result);
                }
                o.setChild(null);//递归走出来后就不需要child了
                result.add(o);//将当前节点存到结果集里
            }
        }
     

    public class Node {
        public Node(String id){
            this.id = id;
        }
        private Integer sort;
        private List child;
        private String id;
        private String parentId;
    //省略了get set方法没写,自己测的时候记得加上
    }

  • 相关阅读:
    手写一个民用Tomcat (05)
    uboot移植之DDR初始化参数更改
    HTTP与HTTPS:深度解析两种网络协议的工作原理、安全机制、性能影响与现代Web应用中的重要角色
    二维数组与指针(杰哥强化版)
    基于反演法的悬架控制
    11-3 Iterator迭代器接口
    python面向对象进阶-继承、多态
    Firefox修改缓存目录的方法
    Day43-Java基础之单元测试和注解
    【JUC】读写锁
  • 原文地址:https://blog.csdn.net/u011149152/article/details/134184186