java将数据处理成树级结构

处理查询到的数据是List<Map<String,Object>格式

方法 一:处理List<Map<String,Object>类型的数据

注意:方法一中的数据根节点的数据必须放在list集合的首位

//测试可实现
public class test {
    public static void main(String[] args) {
        List<Map<String, Object>> l = new ArrayList();
        Map<String, Object> m = new HashMap();
        m.put("id", "1");
        m.put("name", "根节点");
        m.put("pid", "0");

        Map<String, Object> m1 = new HashMap();
        m1.put("id", "11");
        m1.put("name", "根节点");
        m1.put("pid", "1");

        Map<String, Object> m2 = new HashMap();
        m2.put("id", "12");
        m2.put("name", "根节点");
        m2.put("pid", "11");

        l.add(m);
        l.add(m1);
        l.add(m2);
        System.out.println(getDepartmentTreeList(l).toString());

    }
    private  static List getDepartmentTreeList(List<Map<String, Object>> l) {
        List ldata = new ArrayList();
        Map<String, Object> mjl = new HashMap<>();
        for (Map m : l) {
            String id = m.get("id").toString();
            String parent_id = m.get("pid").toString();
            //if ("根节点id".equals(id)) 此处的根节点id为1
            if ("1".equals(id)) {
                ldata.add(m);
            }
            ///如果包含id 就说明已经自动创建了需要属性覆盖
            if (mjl.containsKey(id)) {
                Map m1 = (Map) mjl.get(id);
                for (Object entry : m.entrySet()) {
                    Map.Entry e = (Map.Entry) entry;
                    m1.put(e.getKey(), e.getValue());
                }
            } else {
                mjl.put(id, m);
            }
            List lmp = null;
            if (!ObjectUtil.isNull(mjl.get(parent_id))) {
                Map m2 = (Map) mjl.get(parent_id);
                if (ObjectUtil.isNull(m2.get("children"))) {
                    m2.put("children", new ArrayList<>());
                }
                lmp = (List) m2.get("children");

            } else {
                lmp = new ArrayList();
                Map m1 = new HashMap();
                m1.put("id", parent_id);
                m1.put("children", lmp);
                mjl.put(parent_id, m1);
            }
            lmp.add(mjl.get(id));
        }
        return ldata;

    }


输出:
[{children=[{children=[{name=根节点, pid=11, id=12}], name=根节点, pid=1, id=11}], name=根节点, pid=0, id=1}]

方法二:处理List<Map<String,Object>类型的数据

方法二是看的网上大神处理List<对象>类型的数据的例子,针对List<Map<String,Object>类型数据做的修改。

  1. getTreeDataUtils是一个帮助类,直接拿过去就可以用。需要修改一下里面的code和pcode,我这里的code和pcode就是id和parentid.
public class getTreeDataUtils {
    private List<Map<String,Object>> rootList; //根节点对象存放到这里
    private List<Map<String,Object>> bodyList; //其他节点存放到这里,可以包含根节点
    //有参构造器
    public getTreeDataUtils(List<Map<String,Object>> rootList, List<Map<String,Object>> bodyList) {
        this.rootList = rootList;
        this.bodyList = bodyList;
    }

    public List<Map<String,Object>> getTree(){   //调用的方法入口
        if(bodyList != null && !bodyList.isEmpty()){
            //声明一个map,用来过滤已操作过的数据
            Map<String,String> map = Maps.newHashMapWithExpectedSize(bodyList.size());
            rootList.forEach( m -> getChild(m,map));
            return rootList;
        }
        return null;
    }

    public void getChild(Map<String,Object> m,Map<String,String> map){
//        Map<String,Object> m2=new HashMap<>();
        List<Map<String,Object>> setChildTreeDto=new ArrayList<>();
        List<Map<String,Object>> childList = Lists.newArrayList();
//此处的code就是id,pcode就是parentid  可根据自己的具体的字段替换
        bodyList.stream()
                .filter(c -> !map.containsKey(c.get("code").toString()))
                .filter(c ->c.get("pcode").toString().equals(m.get("code").toString()))
                .forEach(c ->{
                    map.put(c.get("code").toString(),c.get("pcode").toString());
                    getChild(c,map);
                    childList.add(c);
                });
//        m.setChildTreeDto(childList);
        List lmp = null;
        m.put("children", childList);

    }
}

方法二调用的方式:

// 此处要有根节点的数据集合rootList和节点数据集合bodyList两个集合,将你的两个集合传入getTreeDataUtils(rootList,bodyList)即可。
 getTreeDataUtils utils =  new getTreeDataUtils(rootList,bodyList);
 List<Map<String,Object>> result =  utils.getTree();
 //result 就是你想要的结果

方法三:处理List<对象>类型的数据

这个方法是从网上看到的,
这个实现方式就是方法二中说的网上看的例子,
点击查看方法三

/** * 根据等级查询类目树 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目树,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为树结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装树 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级树返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }
将List数据转换成树形结构的基本思路是首先遍历List,将其中每个节点的父子关系建立起来,然后从根节点开始递归构建整个树形结构。 具体实现步骤如下: 1. 定义节点类,包含节点id、节点名称和子节点列表等属性。 ``` public class TreeNode { private String id; private String name; private List<TreeNode> children; // getter和setter方法 // ... } ``` 2. 遍历List,将每个节点的父子关系建立起来,可以使用Map来存储节点id和对应的节点对象,便于查找父节点。 ``` Map<String, TreeNode> map = new HashMap<>(); for (TreeNode node : list) { map.put(node.getId(), node); String parentId = node.getParentId(); if (parentId != null) { TreeNode parent = map.get(parentId); if (parent != null) { parent.getChildren().add(node); } } } ``` 3. 找到根节点,开始递归构建整个树形结构。 ``` public static TreeNode buildTree(List<TreeNode> list) { // 构建Map,方便查找节点 Map<String, TreeNode> map = new HashMap<>(); for (TreeNode node : list) { map.put(node.getId(), node); } // 找到根节点 TreeNode root = null; for (TreeNode node : list) { if (node.getParentId() == null) { root = node; break; } } // 从根节点开始递归构建整个树形结构 buildSubTree(root, map); return root; } private static void buildSubTree(TreeNode node, Map<String, TreeNode> map) { List<TreeNode> children = node.getChildren(); if (children == null) { return; } // 遍历子节点,递归构建子树 for (TreeNode child : children) { buildSubTree(child, map); } // 根据子节点的顺序重新排序 children.sort(Comparator.comparing(TreeNode::getName)); } ``` 以上就是将List数据转换成树行结构的基本实现方法。需要注意的是,这里的代码只是一个简单的示例,实际情况下可能需要根据具体的业务需求进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值