java实现zTree的遍历
程序员文章站
2024-03-05 15:09:12
...
entity代码:
public class CategoryVO {
private Integer id;
private Integer pId;
private String name;
private String url;
private List<CategoryVO> children=new ArrayList<CategoryVO>();
//get set 省略
}
数据是这样的:
实现代码:
public List<CategoryVO> list(String name,Model model){
List<CategoryVO> categoryList = CategoryJDBC.getCategoryList();
HashMap<Integer, CategoryVO> tmpMap = new HashMap<>(); // 所有对象存放到map中
for (CategoryVO categoryVO : categoryList) {
tmpMap.put(categoryVO.getId(), categoryVO);
}
ArrayList<CategoryVO> arrayList = new ArrayList<>(); // 结果list,之所以用list,是考虑到有多个根目录的情况
for (CategoryVO categoryVO : categoryList) { // 遍历所有元素,放到对应的父节点
if(tmpMap.get(categoryVO.getpId())!=null && categoryVO.getId()!=categoryVO.getpId() ){
CategoryVO categoryVO2 = tmpMap.get(categoryVO.getpId()); //map中找到父节点
List<CategoryVO> children = categoryVO2.getChildren();
children.add(categoryVO); // 添加到父节点的children里
categoryVO2.setChildren(children);
tmpMap.put(categoryVO2.getId(), categoryVO2); //重置添加children后的map
}else{
arrayList.add(categoryVO);
}
}
return categoryList;
}
该方法只用了2次遍历。
第一次,遍历所有对象,放到tmpMap中。
第二次,遍历所有对象,通过tmpMap找到每个节点对应的父节点,并添加到父节点children中。然后父节点再放回map。