将list集合封装成一个树形结构
一般在项目中获取类型列表,应该是一个树形结构的数据
数据库表对应的实体类
/**
* XX类型
*/
public class ModelType {
private Integer id;
private String name;
private Integer pid;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public ModelType() {
}
public ModelType(Integer id, String name, Integer pid) {
this.id = id;
this.name = name;
this.pid = pid;
}
@Override
public String toString() {
return "ModelType{" +
"id=" + id +
", name='" + name + '\'' +
", pid=" + pid +
'}';
}
}
继承此实体类
public class ModelTypeVo extends ModelType {
private List<ModelTypeVo> children;
public List<ModelTypeVo> getChildren() {
return children;
}
public void setChildren(List<ModelTypeVo> children) {
this.children = children;
}
@Override
public String toString() {
return "ModelTypeVo{" +
"children=" + children +
'}';
}
}
测试及封装方法
public class ToTree {
public static void main(String[] args) {
List<ModelType> list = new ArrayList<>();
list.add(new ModelType(1, "数码", null));
list.add(new ModelType(2, "键盘", 1));
list.add(new ModelType(3, "机械键盘", 2));
list.add(new ModelType(4, "薄膜键盘", 2));
list.add(new ModelType(5, "主题键盘", 2));
list.add(new ModelType(6, "鼠标", 1));
list.add(new ModelType(7, "有线鼠标", 6));
list.add(new ModelType(8, "无线鼠标", 6));
list.add(new ModelType(9, "手机", null));
list.add(new ModelType(10, "小米", 9));
list.add(new ModelType(11, "华为", 9));
list.add(new ModelType(12, "红米", 10));
list.add(new ModelType(13, "荣耀", 11));
list.add(new ModelType(14, "畅想", 11));
List<ModelTypeVo> modelTypeVos = toTree(list);
}
/**
* 将list集合封装成树形结构数据
* @param list
* @return
*/
static List<ModelTypeVo> toTree(List<ModelType> list) {
//创建一个map用于存放 <类型id,将类型对象封装成的 ModelTypeVo 对象>
HashMap<Integer, ModelTypeVo> map = new HashMap<>();
List<ModelTypeVo> trees = new ArrayList<>();
list.stream()
.peek(type -> {
ModelTypeVo node = new ModelTypeVo();
node.setId(type.getId());
node.setName(type.getName());
node.setPid(type.getPid());
map.put(type.getId(), node);
})
.forEach(type -> {
Integer pid = type.getPid();
Integer id = type.getId();
ModelTypeVo pNode = map.get(pid);
ModelTypeVo cNode = map.get(id);
//判断map是否存在此pid
if (map.containsKey(pid)) {
//存在,则将该pid的子节点取出来
List<ModelTypeVo> children = pNode.getChildren();
if (children == null) { //如果子节点为空,初始化子节点
children = new ArrayList<>();
pNode.setChildren(children);
}
//将此子节点放入对应父节点下
children.add(cNode);
} else {
trees.add(cNode);
}
});
return trees;
}
}