Java把List集合转成树形结构
创始人
2024-11-10 05:40:11
0

1. 实体类

     org.projectlombok     lombok     1.18.22 
package com.utils;  import lombok.Data; import java.util.List;  /**  * @Description:  * @Author:   * @Date: 2021/12/16 9:35  */ @Data public class TestEntity {     private int id;     private String name;     private int parentId;          private List children;  }

2. 方法一:使用Stream流

private static List listToTree1(List list) {     // 要点     // 通过Collectors.groupingBy(Address::getPid)方法对addresses按照Pid进行分组,也就是将pid相同的放在一起     Map> parentMap = list.stream().collect(Collectors.groupingBy(TestEntity::getParentId));     list.forEach(item -> {         item.setChildren(parentMap.get(item.getId()));     });     // 过滤出根节点集合,根节点已经包含了孩子节点     List newList = list.stream().filter(item -> item.getParentId() == 0).collect(Collectors.toList());     return newList; }

3. 方法二:使用fastjson

添加依赖

     com.alibaba     fastjson     1.2.73 
/** * @param list          :要转成树的集合 * @param keyMark       :id * @param parentKeyMark :pid * @param childMark     :children * @return List:树集合 * @description :如TestEntity中有字段    int id,String name,int parentId,List children字段 * keyMark、parentKeyMark、childMark就是    "id", "parentId", "children" */ public static List listToTree2(List list, String keyMark, String parentKeyMark, String childMark) {     JSONArray jsonArray = JSONArray.parseArray(JSONObject.toJSONString(list));     JSONArray jsonArrayTree = new JSONArray();     JSONObject hash = new JSONObject();     //将数组转为Object的形式,key为数组中的id     for (int i = 0; i < jsonArray.size(); i++) {         JSONObject json = (JSONObject) jsonArray.get(i);         hash.put(json.getString(keyMark), json);     }     //遍历结果集     for (int j = 0; j < jsonArray.size(); j++) {         //单条记录         JSONObject aVal = (JSONObject) jsonArray.get(j);         //在hash中取出key为单条记录中pid的值         if (null != aVal.get(parentKeyMark) && !"".equals(aVal.get(parentKeyMark))) {             JSONObject hashVP = (JSONObject) hash.get(aVal.get(parentKeyMark).toString());             //如果记录的pid存在,则说明它有父节点,将她添加到孩子节点的集合中             if (hashVP != null) {                 //检查是否有child属性                 if (hashVP.get(childMark) != null) {                     JSONArray ch = (JSONArray) hashVP.get(childMark);                     ch.add(aVal);                     hashVP.put(childMark, ch);                 } else {                     JSONArray ch = new JSONArray();                     ch.add(aVal);                     hashVP.put(childMark, ch);                 }             } else {                 jsonArrayTree.add(aVal);             }         } else {             jsonArrayTree.add(aVal);         }     }     return jsonArrayTree.toJavaList(TestEntity.class); }

4. 方法三:使用递归

/** * 使用递归方法建树 * * @param list 要转成树的集合 * @return List */ public static List listToTree2(List list) {     List trees = new ArrayList<>();     for (TestEntity entity : list) {         int parentId = entity.getParentId();         if (parentId == 0) {             // 是父级             trees.add(findChildren(entity, list));         }     }     return trees; }  /** * 递归查找子节点 * * @param entity 对象 * @param list 子节点 * @return MenuTree */ private static TestEntity findChildren(TestEntity entity, List list) {     for (TestEntity info : list) {         if (entity.getId() == info.getParentId()) {             if (entity.getChildren() == null) {                 entity.setChildren(new ArrayList<>());             }             entity.getChildren().add(findChildren(info, list));         }     }     return entity; }

5. 完整测试类

package list;  import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject;  import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors;  public class ListToTreeTest {     public static void main(String[] args) {         List list = new ArrayList<>();          TestEntity testEntity1 = new TestEntity();         testEntity1.setId(1);         testEntity1.setName("张三");         testEntity1.setParentId(0);          TestEntity testEntity2 = new TestEntity();         testEntity2.setId(2);         testEntity2.setName("李四");         testEntity2.setParentId(0);          TestEntity testEntity3 = new TestEntity();         testEntity3.setId(3);         testEntity3.setName("张三儿子");         testEntity3.setParentId(1);          list.add(testEntity1);         list.add(testEntity2);         list.add(testEntity3);           List result1 = listToTree1(list);         System.out.println(result1);  //        List result2 = listToTree2(list, "id", "parentId", "children"); //        System.out.println(result2);  //        List result3 = listToTree3(list); //        System.out.println(result3);      }      private static List listToTree1(List list) {         // 要点         // 通过Collectors.groupingBy(Address::getPid)方法对addresses按照Pid进行分组,也就是将pid相同的放在一起         Map> parentMap = list.stream().collect(Collectors.groupingBy(TestEntity::getParentId));         list.forEach(item -> {             item.setChildren(parentMap.get(item.getId()));         });         // 过滤出根节点集合,根节点已经包含了孩子节点         List newList = list.stream().filter(item -> item.getParentId() == 0).collect(Collectors.toList());         return newList;     }      /**      * @param list          :要转成树的集合      * @param keyMark       :id      * @param parentKeyMark :pid      * @param childMark     :children      * @return List:树集合      * @description :如TestEntity中有字段    int id,String name,int parentId,List children字段      * keyMark、parentKeyMark、childMark就是    "id", "parentId", "children"      */     public static List listToTree2(List list, String keyMark, String parentKeyMark, String childMark) {         JSONArray jsonArray = JSONArray.parseArray(JSONObject.toJSONString(list));         JSONArray jsonArrayTree = new JSONArray();         JSONObject hash = new JSONObject();         //将数组转为Object的形式,key为数组中的id         for (int i = 0; i < jsonArray.size(); i++) {             JSONObject json = (JSONObject) jsonArray.get(i);             hash.put(json.getString(keyMark), json);         }         //遍历结果集         for (int j = 0; j < jsonArray.size(); j++) {             //单条记录             JSONObject aVal = (JSONObject) jsonArray.get(j);             //在hash中取出key为单条记录中pid的值             if (null != aVal.get(parentKeyMark) && !"".equals(aVal.get(parentKeyMark))) {                 JSONObject hashVP = (JSONObject) hash.get(aVal.get(parentKeyMark).toString());                 //如果记录的pid存在,则说明它有父节点,将她添加到孩子节点的集合中                 if (hashVP != null) {                     //检查是否有child属性                     if (hashVP.get(childMark) != null) {                         JSONArray ch = (JSONArray) hashVP.get(childMark);                         ch.add(aVal);                         hashVP.put(childMark, ch);                     } else {                         JSONArray ch = new JSONArray();                         ch.add(aVal);                         hashVP.put(childMark, ch);                     }                 } else {                     jsonArrayTree.add(aVal);                 }             } else {                 jsonArrayTree.add(aVal);             }         }         return jsonArrayTree.toJavaList(TestEntity.class);     }      /**      * 使用递归方法建树      *      * @param list 要转成树的集合      * @return List      */     public static List listToTree3(List list) {         List trees = new ArrayList<>();         for (TestEntity entity : list) {             int parentId = entity.getParentId();             if (parentId == 0) {                 // 是父级                 trees.add(findChildren(entity, list));             }         }         return trees;     }      /**      * 递归查找子节点      *      * @param entity 对象      * @param list   子节点      * @return MenuTree      */     private static TestEntity findChildren(TestEntity entity, List list) {         for (TestEntity info : list) {             if (entity.getId() == info.getParentId()) {                 if (entity.getChildren() == null) {                     entity.setChildren(new ArrayList<>());                 }                 entity.getChildren().add(findChildren(info, list));             }         }         return entity;     } }

相关内容

热门资讯

透视研究!wpk微扑克辅助ai... 1、透视研究!wpk微扑克辅助ai,线上德州辅助工具有哪些(其实真的有挂)(UU poker、、xp...
线上教程!扑克世界app辅助(... 线上教程!扑克世界app辅助(wepoke有辅助挂)原来确实真的有挂(有挂技巧)1、每一步都需要思考...
9分钟透明挂!aapoker有... 9分钟透明挂!aapoker有手游版吗"微扑克辅助机器人(原来真的有挂)-哔哩哔哩1、首先打开微扑克...
透视科普!云扑克辅助透视,德扑... 透视科普!云扑克辅助透视,德扑之星真破解套路(其实真的有挂)1、玩家可以在软件透明挂俱乐部对游戏的模...
透视辅助!微扑克有挂么(德州a... 透视辅助!微扑克有挂么(德州ai)辅助透视(其实真的有挂)是一款可以让一直输的玩家,快速成为一个“必...
2024新版教程!德扑胜率计算... 2024新版教程!德扑胜率计算的软件(aapoker有挂)其实真的有挂(有挂插件)1、点击下载安装,...
4分钟总结!pokermast... 4分钟总结!pokermaster有挂吗"德州ai机器人(原来真的有挂)-哔哩哔哩1、实时poker...
力荐教程!德扑ai软件(德州a... 力荐教程!德扑ai软件(德州ai人工智能)原来真的是有挂(有挂插件)是一款可以让一直输的玩家,快速成...
透视内幕!wpk微扑克模拟器,... 透视内幕!wpk微扑克模拟器,wpk有修改器(原来真的有挂)小薇(透视辅助)致您一封信;亲爱玩家:《...
2分钟了解!智星德州菠萝在哪下... 1、2分钟了解!智星德州菠萝在哪下载"aapoker透明挂(其实真的有挂)-哔哩哔哩;详细教程。2、...