适用于父子关系的数据结构。
@Override
public List<InfoFloorTreeVo> list(FloorRequest request) {
// TODO Auto-generated method stub
List<InfoFloor> infoFloorList = infoFloorMapper.selectLikeByName(request);
List<InfoFloorTreeVo> treeNodes = new ArrayList<>();
InfoFloorTreeVo treeNode = null;for (InfoFloor infoFloor : infoFloorList) {
treeNode = new InfoFloorTreeVo();
treeNode.setId(infoFloor.getFloorId());
treeNode.setName(infoFloor.getName());
treeNode.setUrl(infoFloor.getUrl());
treeNode.setWidth(infoFloor.getWidth());
treeNode.setHeight(infoFloor.getHeight());
treeNode.setParentId(infoFloor.getParentId());
treeNodes.add(treeNode);
}
recursiveFloor(treeNodes);
List<InfoFloorTreeVo> infoFloorTreeVos = new ArrayList<>();
for (InfoFloorTreeVo infoFloorTreeVo : treeNodes) {
if (infoFloorTreeVo.getParentId() == null) {
infoFloorTreeVos.add(infoFloorTreeVo);
}
}
return infoFloorTreeVos;
}
public void recursiveFloor(List<InfoFloorTreeVo> treeNodes) {
InfoRegion record = null;
for (InfoFloorTreeVo infoFloorTreeVo : treeNodes) {
List<InfoFloor> floors = infoFloorMapper.selectFloorByParentId(infoFloorTreeVo.getId());
if (floors.size() > 0 || infoFloorTreeVo.getParentId() != null && infoFloorTreeVo.getParentId() > 0) {
findFloorChildren(treeNodes, infoFloorTreeVo);
}
// records
record = new InfoRegion();
record.setFloorId(infoFloorTreeVo.getId());
List<InfoRegion> infoRegionList = infoRegionMapper.select(record);
List<InfoRegionTreeVo> regionTreeNodes = convertInfoRegionTreeVo(infoRegionList);
recursiveRegion(regionTreeNodes);
regionTreeNodes = removeOtherChildren(regionTreeNodes);
infoFloorTreeVo.setRegions(regionTreeNodes);
}
}
public List<InfoRegionTreeVo> removeOtherChildren(List<InfoRegionTreeVo> regionTreeNodes) {
List<InfoRegionTreeVo> treeVos = new ArrayList<>();
for (InfoRegionTreeVo infoRegionTreeVo : regionTreeNodes) {
if (infoRegionTreeVo.getParentId() == null) {
treeVos.add(infoRegionTreeVo);
}
}
return treeVos;
}
public InfoFloorTreeVo findFloorChildren(List<InfoFloorTreeVo> treeNodes, InfoFloorTreeVo treeVo) {
List<InfoFloorTreeVo> currentChild = null;
InfoRegion record = null;
for (InfoFloorTreeVo infoFloorTreeVo : treeNodes) {
if (infoFloorTreeVo.getParentId() != null
&& treeVo.getId().intValue() == infoFloorTreeVo.getParentId().intValue()) {
currentChild = treeVo.getChildren();
if (currentChild == null) {
currentChild = new ArrayList<>();
}
if (!currentChild.contains(infoFloorTreeVo)) {
// records
record = new InfoRegion();
record.setFloorId(infoFloorTreeVo.getId());
List<InfoRegion> infoRegionList = infoRegionMapper.select(record);
List<InfoRegionTreeVo> regionTreeNodes = convertInfoRegionTreeVo(infoRegionList);
recursiveRegion(regionTreeNodes);
regionTreeNodes = removeOtherChildren(regionTreeNodes);
infoFloorTreeVo.setRegions(regionTreeNodes);
currentChild.add(findFloorChildren(treeNodes, infoFloorTreeVo));
treeVo.setChildren(currentChild);
}
}
}
return treeVo;
}
public List<InfoRegionTreeVo> recursiveRegion(List<InfoRegionTreeVo> treeNodes) {
List<InfoRegionTreeVo> trees = new ArrayList<>();
for (InfoRegionTreeVo infoRegionTreeVo : treeNodes) {
InfoRegion infoRegion = new InfoRegion();
infoRegion.setParentId(infoRegionTreeVo.getRegionId());
List<InfoRegion> infoRegions = infoRegionMapper.select(infoRegion);
if (infoRegions.size() > 0
|| infoRegionTreeVo.getParentId() != null && infoRegionTreeVo.getParentId() > 0) {
findRegionChildren(treeNodes, infoRegionTreeVo);
}
}
return trees;
}public static InfoRegionTreeVo findRegionChildren(List<InfoRegionTreeVo> treeNodes, InfoRegionTreeVo treeVo) {
List<InfoRegionTreeVo> currentChild = null;
for (InfoRegionTreeVo infoRegionTreeVo : treeNodes) {
if (infoRegionTreeVo.getParentId() != null
&& treeVo.getRegionId().intValue() == infoRegionTreeVo.getParentId().intValue()) {
currentChild = treeVo.getChildren();
if (currentChild == null) {
currentChild = new ArrayList<>();
}
if (!currentChild.contains(infoRegionTreeVo)) {
currentChild.add(findRegionChildren(treeNodes, infoRegionTreeVo));
treeVo.setChildren(currentChild);
}
}
}
return treeVo;
}public List<InfoRegionTreeVo> convertInfoRegionTreeVo(List<InfoRegion> infoRegionList) {
List<InfoRegionTreeVo> infoRegionTreeVos = new ArrayList<>();
InfoRegionTreeVo infoRegionTreeVo = null;
for (InfoRegion infoRegion : infoRegionList) {
infoRegionTreeVo = new InfoRegionTreeVo();
infoRegionTreeVo.setName(infoRegion.getName());
infoRegionTreeVo.setRegionId(infoRegion.getRegionId());
infoRegionTreeVo.setParentId(infoRegion.getParentId());
infoRegionTreeVos.add(infoRegionTreeVo);
}
return infoRegionTreeVos;
}
如此这般tree就形成了。