java中实现list转tree的两种方式

使用转换的方式

方式一:递归

	public static void main(String[] args) {
        List<Zone> zones = listWithTree1();
        System.out.println(zones);
    }
	public static List<Zone> listWithTree1() {
        List<Zone> allMenu = new ArrayList<>();

        allMenu.add(new Zone(1,"成都",0));

        allMenu.add(new Zone(2,"南昌",0));

        allMenu.add(new Zone(3,"四川",0));

        allMenu.add(new Zone(4,"绵阳",3));

        allMenu.add(new Zone(5,"天津",3));

        allMenu.add(new Zone(6,"德阳",4));

        allMenu.add(new Zone(7,"西充",1));

        allMenu.add(new Zone(8,"重庆",7));

        List<Zone> rootMenu = new ArrayList<>();

        for (Zone menu : allMenu) {
            if(menu.parentId == 0){
                rootMenu.add(menu);
            }
        }

        for (Zone nav : rootMenu) {
            List<Zone> childList = getChildren(nav.getId(),allMenu);
            nav.setChildren(childList);
        }
        return rootMenu;
    }

    private static List<Zone> getChildren(int id, List<Zone> allMenu) {
        List<Zone> childList = new ArrayList<>();
        for (Zone nav : allMenu) {
            if(nav.getParentId() == id){
                childList.add(nav);
            }
        }
        for (Zone nav : childList) {
            nav.setChildren(getChildren(nav.getId(),allMenu));
        }
        if(childList.size()==0){
            return new ArrayList<Zone>();
        }
        return childList;
    }

方式二:stream

	public static void main(String[] args) {
        List<Zone> zones = listWithTree();
        System.out.println(zones);
    }

    public static List<Zone> listWithTree() {
        // 1、查出所有分类
        List<Zone> zoneList = new ArrayList<>();

        zoneList.add(new Zone(1,"成都",0));

        zoneList.add(new Zone(2,"南昌",0));

        zoneList.add(new Zone(3,"四川",0));

        zoneList.add(new Zone(4,"绵阳",3));

        zoneList.add(new Zone(5,"天津",3));

        zoneList.add(new Zone(6,"德阳",4));

        zoneList.add(new Zone(7,"西充",1));

        zoneList.add(new Zone(8,"重庆",7));

        // 组装成父子的树形结构
		//若是要去掉多余的数据zoneList换为(parentList)只有父亲的数据也就是
		//获取一级分类(父类)
        //List<Zone> parentList = zoneList.stream().filter(x -> x.getParentId() == 0).collect(Collectors.toList());
        return zoneList.stream().filter(m1 ->
                m1.getParentId() == 0
        ).peek(menu -> {
            menu.setChildren(getChildren(menu, zoneList));
        }).collect(Collectors.toList());
    }
    private static List<Zone> getChildren(Zone root, List<Zone> all) {
        return all.stream().filter(m1 -> {
            return m1.getParentId()==(root.getId());
        }).peek(m1 -> {
            m1.setChildren(getChildren(m1, all));
        }).collect(Collectors.toList());
    }

方式三:混合(速度最快)

	public static void main(String[] args) {
        List<Zone> zones = listWithTree();
        System.out.println(zones);
    }

    public static List<Zone> listWithTree() {
        // 1、查出所有分类
        List<Zone> zoneList = new ArrayList<>();

        zoneList.add(new Zone(1,"成都",0));

        zoneList.add(new Zone(2,"南昌",0));

        zoneList.add(new Zone(3,"四川",0));

        zoneList.add(new Zone(4,"绵阳",3));

        zoneList.add(new Zone(5,"天津",3));

        zoneList.add(new Zone(6,"德阳",4));

        zoneList.add(new Zone(7,"西充",1));

        zoneList.add(new Zone(8,"重庆",7));
		//获取一级分类(父类)
        List<Zone> parentList = zoneList.stream().filter(x -> x.getParentId() == 0).collect(Collectors.toList());
        
        //获取二级分类(id作为key,子级作为value组成map)
        Map<Integer, List<Zone>> listMap = zoneList.stream().collect(Collectors.groupingBy(Zone::getParentId));
        //递归查询
        List<Zone> list = treeCategory(parentList, listMap);
        return list;
    }
	public static List<Zone> treeCategory(List<Zone> parentList, Map<Integer, List<Zone>> listMap){
        parentList.forEach(parent-> {
            List<Zone> temp = listMap.get(parent.getId());
            if (temp!=null && !temp.isEmpty()){
                parent.setChildren(temp);
                treeCategory(parent.getChildren(), listMap);
            }else{
                parent.setChildren(new ArrayList<>());
            }
        });
        return parentList;
    }

实体类

	public static class Zone {

        int id;

        String name;

        int parentId;

        List<Zone> children;

        public Zone(int id, String name, int parentId) {

            this.id = id;

            this.name = name;

            this.parentId = parentId;

        }

        public void addChildren(Zone zone){

            if(children == null) {

                children = new ArrayList<>();

            }

            children.add(zone);

        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getParentId() {
            return parentId;
        }

        public void setParentId(int parentId) {
            this.parentId = parentId;
        }

        public List<Zone> getChildren() {
            return children;
        }

        public void setChildren(List<Zone> children) {
            this.children = children;
        }
    }

版权声明:本文为xinhe96原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。