如何高效地将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里面。

 

posted @   羽毛球打的贼好  阅读(730)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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吧
点击右上角即可分享
微信分享提示