CodeZLei

  博客园 :: 首页 :: 博问 :: 闪存 :: :: 联系 :: 订阅 订阅 :: 管理 ::
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.zl;
 
import java.util.ArrayList;
import java.util.List;
 
public class MenuItem {
    private String id;
    private String pid;
    private String name;
    private List<MenuItem> childMenuItemList;
 
    public List<MenuItem> getChildMenuItemList() {
        return childMenuItemList;
    }
 
    public void setChildMenuItemList(List<MenuItem> childMenuItemList) {
        this.childMenuItemList = childMenuItemList;
    }
 
    public String getId() {
        return id;
    }
 
    public void setId(String id) {
        this.id = id;
    }
 
    public String getPid() {
        return pid;
    }
 
    public void setPid(String pid) {
        this.pid = pid;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    @Override
    public String toString() {
        return "MenuItem{" +
                "id='" + id + '\'' +
                ", pid='" + pid + '\'' +
                ", name='" + name + '\'' +
                ", childMenuItemList=" + childMenuItemList +
                '}';
    }
}

  

复制代码
package com.zl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Hello world!
 */
public class App {
    /**
     * 把 list 转化成 tree 的形式
     * 核心是 对象都是引用的,对象间引用添加关联
     * @param itemList
     */
    public static Map<String, MenuItem> listToTree(List<MenuItem> itemList) {
        //存放树结构的map,返回数据
        HashMap<String, MenuItem> resultMap = new HashMap<>();
        //map初始化 key为id,value为对象,方便根据id直接获取对象
        HashMap<String, MenuItem> menuItemHashMap = new HashMap<>();
        for (MenuItem menuItem : itemList) {
            menuItemHashMap.put(menuItem.getId(), menuItem);
        }
        for (MenuItem menuItem : itemList) {
            String pid = menuItem.getPid();
            if (pid != null && pid != "") {
                MenuItem parentMenuItem = menuItemHashMap.get(pid);
                //有父节点的把当前节点挂在父节点上,没有父节点的说明当前节点就是根节点
                if (null != parentMenuItem) {
                    List<MenuItem> childMenuItemList = parentMenuItem.getChildMenuItemList();
                    if (null != childMenuItemList) {
                        childMenuItemList.add(menuItem);

                    } else {
                        childMenuItemList = new ArrayList<>();
                        parentMenuItem.setChildMenuItemList(childMenuItemList);
                        childMenuItemList.add(menuItem);
                    }
                }else {
                    //没有找到父节点说明当前节点是根节点,放到返回的map中
                    resultMap.put(menuItem.getId(),menuItem);
                }
            }else {
                //没有找到父节点说明当前节点是根节点,放到返回的map中
                resultMap.put(menuItem.getId(),menuItem);
            }

        }
        System.out.println(resultMap);
        return resultMap;
    }


    public static void main(String[] args) {
        ArrayList<MenuItem> menuItemArrayList = new ArrayList<>();
        MenuItem menuItem = new MenuItem();
        MenuItem menuItem2 = new MenuItem();
        MenuItem menuItem3 = new MenuItem();
        MenuItem menuItem4 = new MenuItem();
        MenuItem menuItem5 = new MenuItem();
        MenuItem menuItem6 = new MenuItem();
        MenuItem menuItem7 = new MenuItem();
        MenuItem menuItem8 = new MenuItem();

        menuItemArrayList.add(menuItem);
        menuItemArrayList.add(menuItem2);
        menuItemArrayList.add(menuItem3);
        menuItemArrayList.add(menuItem4);
        menuItemArrayList.add(menuItem5);
        menuItemArrayList.add(menuItem6);
        menuItemArrayList.add(menuItem7);
        menuItemArrayList.add(menuItem8);

        menuItem.setId("1");
        menuItem.setPid("0");
        menuItem.setName("1");

        menuItem2.setId("2");
        menuItem2.setPid("0");
        menuItem2.setName("2");

        menuItem3.setId("3");
        menuItem3.setPid("2");
        menuItem3.setName("2.1");

        menuItem4.setId("4");
        menuItem4.setPid("0");
        menuItem4.setName("4");

        menuItem5.setId("5");
        menuItem5.setPid("4");
        menuItem5.setName("4.1");

        menuItem6.setId("6");
        menuItem6.setPid("5");
        menuItem6.setName("4.1.1");

        menuItem7.setId("7");
        menuItem7.setPid("6");
        menuItem7.setName("4.1.1.1");

        menuItem8.setId("8");
        menuItem8.setPid("6");
        menuItem8.setName("4.1.1.2");



        listToTree(menuItemArrayList);
    }
}
复制代码

 

posted on   CodeZLei  阅读(169)  评论(0)    收藏  举报
编辑推荐:
· 如何正确实现一个 BackgroundService
· 抽象与性能:从 LINQ 看现代 .NET 的优化之道
· AI 时代,为什么我们还有必要写博客?
· 行业思考:不是前端不行,是只会前端不行
· C#高级GDI+实战:从零开发一个流程图
阅读排行:
· 被 DDoS 攻击的一夜
· 一个被BCL遗忘的高性能集合:C# CircularBuffer<T>深度解析
· 仅一个 Python 文件,狂揽近 2 万 Star「GitHub 热点速览」
· 上周热点回顾(7.28-8.3)
· 架构师必备:实时对账与离线对账
点击右上角即可分享
微信分享提示