树形效果
代码片段:
@Override
public List<IpsegmentVo> findIpByGraphKindAndParentId(Map<String, Object> condition) {
//创建IP段树集合
List<IpsegmentVo> tree = new ArrayList<IpsegmentVo>();
//查询所有IP段集合
List<IpsegmentVo> list = ipsegmentMapper.findIpByGraphKindAndParentId(condition);
//创建Map集合,建立节点和自身id的关系
Map<String, IpsegmentVo> permissionMap = new HashMap<>();
for (IpsegmentVo item : list) {
//将每一个权限点和自己的id建立键值对的关系
permissionMap.put(item.getId(), item);
}
for (IpsegmentVo item : list) {
//把每一个节点看成是子节点
IpsegmentVo child = item;
if (StringUtils.isBlank(item.getParentSegmentId())) {
//顶级节点的父节点id是null,直接添加到权限集合返回
//此时的顶级节点通过下面的for循环已经有了自己的子节点集合
tree.add(item);
} else {
//通过子节点的pid作为键(即作为父节点的id)来获取对应的父节点
IpsegmentVo parent = permissionMap.get(child.getParentSegmentId());
//整合父节点和子节点的关系
parent.getChildren().add(child);
}
}
return tree;
}
采用这种方式,先一次性查询出所有的节点信息
,然后采用双重for循环
的方式,第一次for循环使用Map集合
绑定了每个节点与id的关系
,第二次循环通过条件判断将顶级节点找出来,先放入树形中作为顶级节点,然后再从map集合中找出每个子节点的父节点,用该父节点来拼装子节点,最后形成树形结构,这种方式把循环查询的工作都在代码中完成了,比采用递归
方式组合树形结构效率要高,降低了查询数据库的频率,同时比采用常规的双重for循环要好,常规的双重for循环,查回来的结果放到List集合中,由于List集合没有使用索引,所以查询元素会比较慢,这里将List中的元素遍历一次放到Map集合中,从Map中获取元素就比较快,因为Map集合使用了索引,加快了查询速度