package xxxxx;
import com.google.common.collect.Lists;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
/**
* @ClassName TreeUtil
* @Description 树形工具类
* @Author lw
* @Date 2021/12/23 8:54
* @Version 0.0.2-SNAPSHOT
*/
@Slf4j
public class TreeUtil {
/**
* @author lw
* @Description 获取属性结构
* @Date 2021/12/23 8:58
* @Param [list]
* @return java.util.List<? extends TreeModel>
**/
public static List<? extends TreeUtil.TreeModel> tree(List<? extends TreeUtil.TreeModel> list){
//存储根节点的菜单,即一级菜单
List<TreeUtil.TreeModel> models =new ArrayList<>();
//遍历所有数据,找到根节点菜单
for (TreeUtil.TreeModel item: list) {
if(StringUtils.equals("0", item.getParentCode()) || StringUtils.isBlank(item.getParentCode())){
item.setLevel(1);
//找到根节点菜单的时候,寻找这个根节点菜单下的子节点菜单。
findChildren(item, list);
//添加到根节点的列表中
models.add(item);
}
}
return models;
}
private static void findChildren(TreeModel root, List<? extends TreeUtil.TreeModel> list){
List<TreeUtil.TreeModel> childrenList =new ArrayList<>();
//遍历所有数据,找到是入参父节点的子节点的数据,然后加到childlist集合中。
for (TreeUtil.TreeModel menu : list) {
if (org.apache.commons.lang3.StringUtils.equals(root.getCode(), menu.getParentCode())){
if (menu.getSort() == null) {
menu.setSort(0);
}
childrenList.add(menu);
if (StringUtils.equals("0", root.getParentCode()) || StringUtils.isBlank(root.getParentCode())) {
menu.setLevel(2);
} else {
if (!ObjectUtils.isEmpty(root.getLevel())) {
menu.setLevel(root.getLevel() + 1);
} else {
root.setLevel(2);
}
}
}
}
if (CollectionUtils.isEmpty(root.getChildren())) {
//若子节点不存在,那么就不必再遍历子节点中的子节点了 直接返回。
if(childrenList.size()==0) {
return;
}
//排序
childrenList.sort(Comparator.comparing(TreeModel::getSort));
//设置父节点的子节点列表
root.setChildren(childrenList);
}
//若子节点存在,接着递归调用该方法,寻找子节点的子节点。
for (TreeUtil.TreeModel child : root.getChildren()) {
// log.info("rootParentCode: {}", root.getParentCode());
// log.info("rootCode: {}", root.getCode());
// log.info("childParentCode: {}", child.getParentCode());
// log.info("childCode: {}", child.getCode());
// log.info("root: {}", root.toString());
// log.info("child: {}", root.getChildren().toString());
findChildren(child, list);
}
}
@Data
public static class TreeModel {
private String parentCode;
private String code;
private Integer sort;
private Integer level;
private List<? extends TreeUtil.TreeModel> children = Lists.newArrayList();
}
@Getter
@Setter
@NoArgsConstructor
public static class TreeDemo extends TreeUtil.TreeModel{
private Integer id;
private String name;
public TreeDemo(Integer id, String name, String parentCode, String code, Integer orderNo) {
this.id = id;
this.name = name;
super.setParentCode(parentCode);
super.setCode(code);
super.setSort(orderNo);
}
}
public static void main(String[] args) {
List<TreeUtil.TreeDemo> list = new ArrayList<>();
list.add(new TreeUtil.TreeDemo(1, "tom", "0", "1", 1));
list.add(new TreeUtil.TreeDemo(2, "jack", "1", "2", 1));
list.add(new TreeUtil.TreeDemo(3, "rose", "1", "3", 2));
List<TreeUtil.TreeModel> treeModels = (List<TreeModel>) TreeUtil.tree(list);
System.out.println(treeModels.toString());
}
}
树形结构工具类
于 2021-12-24 08:51:17 首次发布