关于数据结构的重要性,在我入行8个月的时候,我才发现,代码想写的好数据结构的应用是必不可少的,重要性的话想要另开一片谈谈感想。下面介绍一下咱们做项目时通用的树结构,既减少代码量,又让代码更加优雅,引用大佬们经常说的如何让代码更加优雅。。。哈哈(o゜▽゜)o☆
上个接收实体代码块:
public class Tree {
@ApiModelProperty("ID")
private String id;
@ApiModelProperty("节点名称")
private String label;
@ApiModelProperty("父节点id")
private String parentId;
@ApiModelProperty("子节点列表")
private List<Tree> children;
}
通过这个实体将数据库里你的各种父子数据查出来,也许说的不准确,见谅,大概这么个意思。
姑且将查出来的方法叫List<Tree> getTreeList()
;
查出来后咱们把数据进行组合,让咱们便于使用,
//传入查出数据,和你想要的数据的父节点
public Tree combineTree(List<Tree> treeList, String Code) {
Tree result = null;
if (treeList != null && treeList.size() != 0) {
for (Tree tree1 : treeList) {
for (Tree tree2 : treeList) {
if (StringUtils.isNotBlank(tree2.getParentId()) && tree2.getParentId().equals(tree1.getId())) {
if (tree1.getChildren() == null) {
List<Tree> children = Lists.newArrayList();
tree1.setChildren(children);
}
tree1.getChildren().add(tree2);
}
}
if (StringUtils.isNotBlank(Code) && tree1.getId().equals(Code)) {
result = tree1;
} else if (StringUtils.isBlank(tree1.getParentId())) {
result = tree1;
}
}
}
return result;
}
然后再转回list集合
public List<Tree> TreeToList(Tree tree) {
List<Tree> result = Lists.newArrayList();
Queue<Tree> queue = new LinkedList<>();
queue.offer(tree);
while (!queue.isEmpty()) {
Tree treeInQueue = queue.poll();
if (treeInQueue.getChildren() != null && treeInQueue.getChildren().size() != 0) {
for (Tree treeInQueueChild : treeInQueue.getChildren()) {
queue.offer(treeInQueueChild);
}
}
result.add(treeInQueue);
}
return result;
}
有人可能会疑问,转来转去不和没转一样吗?其实有点不一样,这个是取到了你想要的父节点下面的数据了。
有人可能会说,那给个数据库条件直接查不就行了吗,这样多费事。其实当一
个项目都需要这样一个通用的表来归纳一颗树的时候,你一次次的进行遍历循环
查然后给其他实体set数据的时候。数据库的操作 无形中会增加成千上百次(举
个例子说的也可能不准,意思是操作数据库太多)。
这样处理的话你只需要查一次所有数据,然后通过代码将你想要的取出就行。最后,将你想要的传给你想set或者想查的sql里进行一个批量循环。也能节省很多事,这几个方法可以通用到项目里,省去了好多事。
上个流转列表然后转数组。
List<String> strings = tree.stream().map(Tree::getId).collect(Collectors.toList());
String[] s = strings.toArray(new String[strings.size()]);
然后上面的数组可以批量塞入一些需要的地方,大家结合自己实际情况使用,也许我用的复杂了。
(我认为直接使用转成的那个list集合也行,哈哈o( ̄▽ ̄)o)。