集合转为tree(单次循环list转tree)

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

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

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

public interface TreeNode<T> {

    String getId();

    String getParentId();

    Integer getDepth();

    List<T> getChildren();

    void setChildren(List<T> children);
}

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

@Data
public class BasicArea implements TreeNode<BasicArea>{

    @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<BasicArea> 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 <T extends TreeNode<T>> List<T> toTree(Collection<T> list) {

        List<T> result = CollectionUtil.newArrayList();

        Map<String, T> 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<T> 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<BasicArea> 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<BasicArea> basicAreas = toTree(result);

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

    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
将一个 List 换为树形结构,需要先将 List 中的元素按照父子关系进行排序,然后通过递归构建树形结构。下面是一个 Java 实现的示例代码: ```java public class TreeNode { private int id; private String name; private int parentId; private List<TreeNode> children = new ArrayList<>(); // 省略 getter 和 setter 方法 // 将 List 换为树形结构 public static List<TreeNode> buildTree(List<TreeNode> nodeList) { List<TreeNode> treeList = new ArrayList<>(); Map<Integer, TreeNode> nodeMap = new HashMap<>(); // 将节点放入 Map 中,方便后续查找 for (TreeNode node : nodeList) { nodeMap.put(node.getId(), node); } // 遍历节点,将子节点添加到父节点的 children 列表中 for (TreeNode node : nodeList) { if (node.getParentId() == 0) { // 根节点的 parentId 为 0 treeList.add(node); } else { TreeNode parent = nodeMap.get(node.getParentId()); if (parent != null) { parent.getChildren().add(node); } } } return treeList; } } ``` 示例代码中定义了一个 TreeNode 类,表示树节点,包含了节点的 id、name、parentId 和 children 属性。buildTree 方法接收一个 List<TreeNode> 参数,返回树形结构的根节点列表。 在 buildTree 方法中,首先遍历 nodeList,将节点放入一个 Map 中,方便后续查找。然后再次遍历 nodeList,将子节点添加到父节点的 children 列表中。如果当前节点的 parentId 为 0,则说明它是根节点,将其添加到 treeList 中返回。最终,treeList 中包含了所有根节点,每个根节点下面可能有子节点。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寂寞旅行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值