2021-07-12 集合转为tree(单次循环list转tree)

看了下hutool中的treeUtil,由于自定义的实体类转的时候,需要自定义config中的每一个字段,这会很慢,其次也很繁琐,然后发现一个更好的方法,分享一下

一共分两步: 第一步,定义一个TreeNode抽象,或者接口,作用是,一会儿在转tree的时候要用的属性方法,在此定义好,然后实体类去继承/实现
第二步,通过一个方法,获取每个元素的相应属性方法,将list集合,转为tree结构

1 TreeNode 根据每个类的具体需要去自定义

public interface TreeNode {

    String getId();

    String getParentId();

    Integer getDepth();

    List getChildren();

    void setChildren(List children);
}

2 实体类 ,去继承/实现 TreeNode中定义的方法(正常来说不用实现,仅仅是实体类属性的get/set)

@Data
public class BasicArea implements TreeNode{

    @NotBlank(groups={AreaValid.update.class})
    private String id;

    /**
    * 区域名称
    */
    private String name;

    /**
    * 区域码
    */
    private String code;

    /**
    * 区域备注
    */
    private String remark;

    /**
    * 父级区域id
    */

    @NotNull(message = "不能为null")
    private String parentId;

    /**
    * 所有父级区域id
    */
    @Min(value=3,message = "长度最小值为3")
    @Max(value=30,message = "长度最大值为30")
    private String path;

    /**
    * 区域层级
    */
    private Integer depth;

    /**
    * 扩展属性
    */
    private String extend;

    /**
    * 排序号
    */
    private Integer sort;

    /**
    * 删除标识【0未删除 1删除】
    */
    private Boolean deleteStatus;

    /**
    * 创建人
    */
    private String createUser;

    /**
    * 创建时间
    */
    private Date createTime;

    /**
    * 修改人
    */
    private String updateUser;

    /**
    * 修改时间
    */
    private Date updateTime;

    /**
    * 预留属性1
    */
    private String column1;

    /**
    * 预留属性2
    */
    private String column2;

    /**
    * 预留属性3
    */
    private String column3;

    /**
    * 预留属性4
    */
    private String column4;

    /**
    * 预留属性5
    */
    private String column5;

    List children;

    public BasicArea(String id, String parentId, int depth) {
        this.id = id;
        this.parentId = parentId;
        this.depth = depth;

    }
}

3 写个方法,去转换 TreeUtil

public class TreeUtil {

    // 将集合转为树

    public static > List toTree(Collection list) {

        List result = CollectionUtil.newArrayList();

        Map map = CollectionUtil.newHashMap();

        for (T t : list) {
            String id = t.getId();
            String parentId = t.getParentId();
            Integer depth = t.getDepth();

            if (depth == null || depth == 0 || parentId == null || !map.containsKey(parentId)) {
                result.add(t);
            } else {
                T parent = map.get(parentId);
                List children = parent.getChildren();
                if (CollectionUtil.isEmpty(children)) {
                    children = CollectionUtil.newArrayList();
                }
                children.add(t);
                parent.setChildren(children);
            }
            map.put(id, t);
        }
        return result;
    }

    // 测试方法
    public static void main(String[] args) {
        List result = CollectionUtil.newArrayList();
        result.add(new BasicArea("0",null,0));
        result.add(new BasicArea("1","0",1));
        result.add(new BasicArea("2","1",2));
        result.add(new BasicArea("3","2",3));
        result.add(new BasicArea("4","0",1));

        List basicAreas = toTree(result);

        System.out.println(JSONUtil.toJsonStr(basicAreas));

    }

}

你可能感兴趣的:(2021-07-12 集合转为tree(单次循环list转tree))