如何高效地将List转换成树形结构,一层循环,HashMap实现
开发过程中经常遇到从List里面找出父子结构,一个子节点对应一个父节点,一个父节点可以有多个子节点。
比如 南京市、苏州市都是江苏省,浙江市属于浙江省,合肥市属于安徽省。
输入:
[
{fatherId='1', fatherName='江苏省', sonId='1', sonName='南京市'},
{fatherId='1', fatherName='江苏省', sonId='2', sonName='苏州市'},
{fatherId='2', fatherName='浙江省', sonId='3', sonName='杭州市'},
{fatherId='3', fatherName='安徽省', sonId='4', sonName='合肥市'}
]
输出:
[
{fatherId='1', fatherName='江苏省', rawDataList=[
{fatherId='1', fatherName='江苏省', sonId='1', sonName='南京市'},
{fatherId='1', fatherName='江苏省', sonId='2', sonName='苏州市'}
]
},
{fatherId='2', fatherName='浙江省', rawDataList=[{fatherId='2', fatherName='浙江省', sonId='3', sonName='杭州市'}]},
{fatherId='3', fatherName='安徽省', rawDataList=[{fatherId='3', fatherName='安徽省', sonId='4', sonName='合肥市'}]}
]
话不多说,上代码:
原始数据
public class RawData { private String fatherId; private String fatherName; private String sonId; private String sonName; public String getFatherId() { return fatherId; } public void setFatherId(String fatherId) { this.fatherId = fatherId; } public String getFatherName() { return fatherName; } public void setFatherName(String fatherName) { this.fatherName = fatherName; } public String getSonId() { return sonId; } public void setSonId(String sonId) { this.sonId = sonId; } public String getSonName() { return sonName; } public void setSonName(String sonName) { this.sonName = sonName; } public RawData() { } public RawData(String fatherId, String fatherName, String sonId, String sonName) { this.fatherId = fatherId; this.fatherName = fatherName; this.sonId = sonId; this.sonName = sonName; } @Override public String toString() { return "{" + "fatherId='" + fatherId + '\'' + ", fatherName='" + fatherName + '\'' + ", sonId='" + sonId + '\'' + ", sonName='" + sonName + '\'' + '}'; } }
目的树形结构
public class Tree { private String fatherId; private String fatherName; private List<RawData> rawDataList; public String getFatherId() { return fatherId; } public void setFatherId(String fatherId) { this.fatherId = fatherId; } public String getFatherName() { return fatherName; } public void setFatherName(String fatherName) { this.fatherName = fatherName; } public List<RawData> getRawDataList() { return rawDataList; } public void setRawDataList(List<RawData> rawDataList) { this.rawDataList = rawDataList; } @Override public String toString() { return "{" + "fatherId='" + fatherId + '\'' + ", fatherName='" + fatherName + '\'' + ", rawDataList=" + rawDataList + '}'; } }
处理逻辑
1 public class Application { 2 public static void main(String[] args) { 3 List<RawData> rawDataList = new ArrayList<>(); 4 rawDataList.add(new RawData("1","江苏省","1","南京市")); 5 rawDataList.add(new RawData("1","江苏省","2","苏州市")); 6 rawDataList.add(new RawData("2","浙江省","3","杭州市")); 7 rawDataList.add(new RawData("3","安徽省","4","合肥市")); 8 System.out.println(rawDataList); 9 List<Tree> tree = getTree(rawDataList); 10 System.out.println(tree); 11 12 } 13 public static List<Tree> getTree(List<RawData> rawDataList){ 14 List<Tree> treeList = new ArrayList<>(); 15 Map<String,List<RawData>> treeMap = new HashMap<>(); 16 Set<String> father = treeMap.keySet(); 17 for (RawData r:rawDataList) { 18 treeMap.putIfAbsent(r.getFatherId(),new ArrayList<>()); 19 treeMap.get(r.getFatherId()).add(r); 20 } 21 for (String fatherId:father) { 22 Tree tree = new Tree(); 23 tree.setFatherId(fatherId); 24 tree.setFatherName(treeMap.get(fatherId).get(0).getFatherName()); 25 tree.setRawDataList(treeMap.get(fatherId)); 26 treeList.add(tree); 27 } 28 return treeList; 29 } 30 }
处理逻辑:
将父节点id 和 原始数据list作为一个map,对原始数据list进行循环遍历,如果原始数据list里面对象的fatherId没有出现过,则创建一个新的ArrayList,然后把原始数据对象增加到Map的value里面。
如果原始数据的list里面有fatherId那么把这个对象追加到该fatherId对应的Value里面。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧