利用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);
}
}
结果: