JAVA将List<Map<String,Object>>数据结构,组装成上下级的树结构

直接上菜,最终效果在这里插入图片描述

添加依赖

 <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>2.0.10</version>
  </dependency>
  <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.12.0</version>
  </dependency>
  <dependency>
      <groupId>com.adobe.aem</groupId>
      <artifactId>uber-jar</artifactId>
      <version>6.5.17</version>
  </dependency>

核心Code

package com.xxx.xxx.controller.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

import org.apache.commons.lang3.StringUtils;

import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

public class ZdjTest {
	
	
	public static void main(String[] args) {
		
	    List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
        Map<String, Object> subMap1 = new HashMap<String, Object>();
        Map<String, Object> subMap2 = new HashMap<String, Object>();
        Map<String, Object> subMap3 = new HashMap<String, Object>();
        Map<String, Object> subMap4 = new HashMap<String, Object>();
        Map<String, Object> subMap5 = new HashMap<String, Object>();
        Map<String, Object> subMap6 = new HashMap<String, Object>();
        Map<String, Object> subMap7 = new HashMap<String, Object>();
        Map<String, Object> subMap8 = new HashMap<String, Object>();

        subMap1.put("peron_busis_attr", "四川省");
        subMap1.put("peron_busis_class", "南充县");
        subMap1.put("peron_busis_subclass", "挑花小镇");

        subMap2.put("peron_busis_attr", "四川省");
        subMap2.put("peron_busis_class", "达州市");
        subMap2.put("peron_busis_subclass", "");

        subMap3.put("peron_busis_attr", "四川省");
        subMap3.put("peron_busis_class", "南充县");
        subMap3.put("peron_busis_subclass", "风车小镇");

        subMap4.put("peron_busis_attr", "四川省");
        subMap4.put("peron_busis_class", "南充县");
        subMap4.put("peron_busis_subclass", "高铁小镇");

        subMap5.put("peron_busis_attr", "四川省");
        subMap5.put("peron_busis_class", "南充县");
        subMap5.put("peron_busis_subclass", "玫瑰小镇");

        subMap6.put("peron_busis_attr", "四川省");
        subMap6.put("peron_busis_class", "南充县");
        subMap6.put("peron_busis_subclass", "燕京小镇");

        subMap7.put("peron_busis_attr", "湖北省");
        subMap7.put("peron_busis_class", "宜昌市");
        subMap7.put("peron_busis_subclass", "");

        subMap8.put("peron_busis_attr", "湖北省");
        subMap8.put("peron_busis_class", "荆州市");
        subMap8.put("peron_busis_subclass", "");

        result.add(subMap1);
        result.add(subMap2);
        result.add(subMap3);
        result.add(subMap4);
        result.add(subMap5);
        result.add(subMap6);
        result.add(subMap7);
        result.add(subMap8);

        List<Map<String, Object>> list = mapToTree(result, "one");
        System.out.println(JSON.toJSONString(list));
    }

 private static List<Map<String, Object>> mapToTree(List<Map<String, Object>> result, String level) {
    	Map<String,Object> kkMap = new HashMap<String,Object>();
        Map<String, List<Map<String, Object>>> departMap = result.stream()
                .filter(map -> isNotBlank(getNameByLevel(map, level)))
                .collect(Collectors.groupingBy(map -> getNameByLevel(map, level)));
        
        System.out.println(departMap);
        
        List<Map<String, Object>> resultList = Lists.newArrayList();
        
	  for (String key : departMap.keySet()) {
	        	
	        	System.out.println("key--->" + key);
	        	
	            List<Map<String, Object>> mapList = departMap.get(key);
	            
	            System.out.println("mapList--->" + mapList);
	            
	            Map<String, Object> subMap = Maps.newHashMap();
	            subMap.put("position_name", key);
	            //前端显示方式
	            subMap.put("display_css", "hs");
	            if("one".equals(level)){
	            //树节点所在层级
	                subMap.put("department_level", "2");
	                subMap.put("display_css", "hh");
	            } else if("two".equals(level)){
	            	if(0 < mapList.size() && mapList.size() < 2) {
	            		subMap.put("parent_name", mapList.get(0).get("peron_busis_attr"));
	            	}else if(mapList.size() > 1) {
	            		subMap.put("parent_name", mapList.get(0).get("peron_busis_attr"));
	            	}
	                subMap.put("department_level", "3");
	            } else if("three".equals(level)){
	              	if(0 < mapList.size() && mapList.size() < 2) {
	            		subMap.put("parent_name", mapList.get(0).get("peron_busis_attr") + "-" + mapList.get(0).get("peron_busis_class"));
	            	}else if(mapList.size() > 1) {
	            		subMap.put("parent_name", mapList.get(0).get("peron_busis_attr") + "-" + mapList.get(0).get("peron_busis_class"));
	            	}
	                subMap.put("department_level", "4");
	            }
	            subMap.put("child_list", mapToTree(mapList, getNextLevel(level)));
	
				if(mapList.size() == 1){
	               Map<String, Object> singleMap =  mapList.get(0);
	                String attrStr = (String)singleMap.get("peron_busis_attr");
	                String classStr = (String)singleMap.get("peron_busis_class");
	                String subClassStr = (String)singleMap.get("peron_busis_subclass");
	                if(StringUtils.isNotBlank(attrStr)){
	                     kkMap.put("peron_busis_attr", attrStr);
	                }if(StringUtils.isNotBlank(classStr)){
	                     kkMap.put("peron_busis_class", classStr);
	                }if(StringUtils.isNotBlank(subClassStr)){
	                     kkMap.put("peron_busis_subClass", subClassStr);
	                }
	            }
	            resultList.add(subMap);
	        }
	        return resultList;
	    }
    
    public static String getNameByLevel(Map<String, Object> map, String level) {
        if (StringUtils.isBlank(level)) {
            return null;
        }
        switch (level) {
            case "one":
                return (String) map.get("peron_busis_attr");
            case "two":
                return (String) map.get("peron_busis_class");
            case "three":
                return (String) map.get("peron_busis_subclass");
            default:
                return null;
        }
    }

    public static String getNextLevel(String level) {
        if (StringUtils.isBlank(level)) {
            return null;
        }
        switch (level) {
            case "one":
                return "two";
            case "two":
                return "three";
            default:
                return null;
        }
    }
}

运行结果

[{"child_list":[{"parent_name":"湖北省","child_list":[],"display_css":"hs","position_name":"荆州市","department_level":"3"},{"parent_name":"湖北省","child_list":[],"display_css":"hs","position_name":"宜昌市","department_level":"3"}],"display_css":"hh","position_name":"湖北省","department_level":"2"},{"child_list":[{"parent_name":"四川省","child_list":[{"parent_name":"四川省-南充县","child_list":[],"display_css":"hs","position_name":"挑花小镇","department_level":"4"},{"parent_name":"四川省-南充县","child_list":[],"display_css":"hs","position_name":"玫瑰小镇","department_level":"4"},{"parent_name":"四川省-南充县","child_list":[],"display_css":"hs","position_name":"高铁小镇","department_level":"4"},{"parent_name":"四川省-南充县","child_list":[],"display_css":"hs","position_name":"风车小镇","department_level":"4"},{"parent_name":"四川省-南充县","child_list":[],"display_css":"hs","position_name":"燕京小镇","department_level":"4"}],"display_css":"hs","position_name":"南充县","department_level":"3"},{"parent_name":"四川省","child_list":[],"display_css":"hs","position_name":"达州市","department_level":"3"}],"display_css":"hh","position_name":"四川省","department_level":"2"}]

上述结果可以通过JSON在线视图查看器查看。

查看器地址:http://www.bejson.com/jsonviewernew/

在这里插入图片描述

最后

自我介绍一下,小编13年毕业于厦门大学,14年在外包公司中软干过,后来去过微软、华为等大厂,20年进入鹅厂担任架构师,直到现在。这一路走来,深知大多数初中级java工程师,想要提升技能,往往需要自己长时间的摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率不仅低效而且还很漫长,很容易就碰到天花板致技术停止不前。 因此我收集整理了一份《java开发全套学习资料》送给大家,里面包含了Spring全家桶,MySQL,中间件Redis、kafka,MQ消息,Zookeeper等java全系列资料,非常适合初中高级各个阶段学习,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料。后面抽时间定期更新一些干货文章,如果你喜欢,也可添加下方名片学习交流 (๑๑)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
$(function(){ $.fn.extend({ SimpleTree:function(options){ //初始化参数 var option = $.extend({ click:function(a){ } },options); option.tree=this; /* 在参数对象中添加对当前菜单的引用,以便在对象中使用该菜单 */ option._init=function(){ /* * 初始化菜单展开状态,以及分叉节点的样式 */ this.tree.find("ul ul").hide(); /* 隐藏所有子级菜单 */ this.tree.find("ul ul").prev("li").removeClass("open"); /* 移除所有子级菜单父节点的 open 样式 */ this.tree.find("ul ul[show='true']").show(); /* 显示 show 属性为 true 的子级菜单 */ this.tree.find("ul ul[show='true']").prev("li").addClass("open"); /* 添加 show 属性为 true 的子级菜单父节点的 open 样式 */ }/* option._init() End */ /* 设置所有超链接不响应单击事件 */ this.find("a").click(function(){ $(this).parent("li").click(); return false; }); /* 菜单项 接受单击 */ this.find("li").click(function(){ /* * 当单击菜单项 * 1.触发用户自定义的单击事件,将该 标签中的第一个超链接做为参数传递过去 * 2.修改当前菜单项所属的子菜单的显示状态(如果等于 true 将其设置为 false,否则将其设置为 true) * 3.重新初始化菜单 */ option.click($(this).find("a")[0]); /* 触发单击 */ /* * 如果当前节点下面包含子菜单,并且其 show 属性的值为 true,则修改其 show 属性为 false * 否则修改其 show 属性为 true */ /* if($(this).next("ul").attr("show")=="true"){ $(this).next("ul").attr("show","false"); }else{ $(this).next("ul").attr("show","true"); }*/ /* 初始化菜单 */ option._init(); }); /* 设置所有父节点样式 */ this.find("ul").prev("li").addClass("folder"); /* 设置节点“是否包含子节点”属性 */ this.find("li").find("a").attr("hasChild",false); this.find("ul").prev("li").find("a").attr("hasChild",true); /* 初始化菜单 */ option._init(); }/* SimpleTree Function End */ }); });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值