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;     } }

相关内容

热门资讯

九分钟辅助!wepoker辅助... 九分钟辅助!wepoker辅助器免费,wepoker怎么看牌型,方案教程(有挂方针)wepoker怎...
三分钟辅助!wepoker作弊... 三分钟辅助!wepoker作弊方法,德普之星私人局辅助器,手筋教程(有挂透视)1、德普之星私人局辅助...
第七分钟辅助!智星菠萝有挂吗,... 第七分钟辅助!智星菠萝有挂吗,智星德州可以透视吗,诀窍教程(有挂规律)该软件可以轻松地帮助玩家将智星...
第5分钟辅助!hhpoker作... 第5分钟辅助!hhpoker作弊码,hh poker透视器下载,课程教程(有挂秘笈)1、hh pok...
一分钟辅助!wpk俱乐部有没有... 一分钟辅助!wpk俱乐部有没有辅助,wepoker私人局辅助挂,诀窍教程(有挂解密)1、下载好wpk...
第2分钟辅助!sohoo竞技联... 第2分钟辅助!sohoo竞技联盟辅助器,pokermaster辅助器,手筋教程(有挂神器)1、soh...
第六分钟辅助!htx矩阵wep... 第六分钟辅助!htx矩阵wepoker辅助,hhpkoer辅助挂是真的吗,指南教程(有挂解密)1、游...
第七分钟辅助!哈糖大菠萝可以开... 第七分钟辅助!哈糖大菠萝可以开挂吗,佛手大菠萝有挂吗,技法教程(有挂详情)哈糖大菠萝可以开挂吗脚本下...
3分钟辅助!pokemmo手机... 3分钟辅助!pokemmo手机版透视脚本,xpoker辅助助手,指南书教程(有挂头条)1、pokem...
6分钟辅助!wepoker好友... 6分钟辅助!wepoker好友局透视,wepoker怎么挂底牌,指引教程(有挂攻略)1、wepoke...