java中利用map实现的树结构封装实现

利用map的性质,O(n)的时间完成树结构封装
所需jar包

       <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
          	<version>1.18.16</version>
        </dependency>

封装实现:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


public class TreeGenerateUtils {


    public static PropertyTreeVo buildTree(List<PropertyValueInfo> originValues, String parentId) {
        HashMap<String, PropertyTreeVo> propertyMap = new HashMap<>(128);
        originValues.forEach(p -> {
            String pid = p.getPid();
            String oid = p.getId();
            //处理当前属性
            PropertyTreeVo current = propertyMap.computeIfAbsent(oid, (id) -> new PropertyTreeVo());
            beanTrans(current, p);

            // 获取父id对应的实体
            PropertyTreeVo parent = propertyMap.computeIfAbsent(pid, (id) -> new PropertyTreeVo());
            parent.setPid(pid);
            // 绑定父子关系
            parent.addChild(current);
        });

        PropertyTreeVo propertyTreeVo = propertyMap.get(parentId);
        if (propertyTreeVo == null) {
            return null;
        }
        return propertyTreeVo;
    }


    private static void beanTrans(PropertyTreeVo result, PropertyValueInfo p) {
        result.setCode(p.getCode());
        result.setId(p.getId());
        result.setName(p.getName());
        result.setPid(p.getPid());
    }

    public static void main(String[] args) {
        List<PropertyValueInfo> originValues = new ArrayList<>();
        PropertyValueInfo child1 = new PropertyValueInfo("1", "0", "属性1", "code1");
        PropertyValueInfo child2 = new PropertyValueInfo("2", "0", "属性2", "code2");
        PropertyValueInfo child3 = new PropertyValueInfo("3", "1", "属性13", "code13");
        originValues.add(child1);
        originValues.add(child2);
        originValues.add(child3);
        PropertyTreeVo propertyTreeVo = buildTree(originValues, "0");
        System.out.println(propertyTreeVo);
    }
}

入参

import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;


@Data
@AllArgsConstructor
public class PropertyValueInfo {


    @ApiModelProperty("属性id")
    private String id;

    @ApiModelProperty("属性pid")
    private String pid;

    @ApiModelProperty("属性名称")
    private String name;

    @ApiModelProperty("属性编码")
    private String code;

}

出参:

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;

import java.util.ArrayList;
import java.util.List;

@Data
@ToString
public class PropertyTreeVo {


    @ApiModelProperty("属性id")
    private String id;

    @ApiModelProperty("属性pid")
    private String pid;

    @ApiModelProperty("属性名称")
    private String name;

    @ApiModelProperty("属性编码")
    private String code;

    @ApiModelProperty("子属性信息")
    List<PropertyTreeVo> children;


    public void addChild(PropertyTreeVo child) {
        if (children == null) {
            children = new ArrayList<>();
        }

        children.add(child);
    }
}

结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值