1.新建一个TreeUtil的类java
package com.zdnst.common.infra.utils; import java.util.*; /** * 把一个list集合,里面的bean含有 parentId 转为树形式 * */ public class TreeUtil { /** * 判断两个父ID是否相同 * @param p1 * @param p2 * @return */ private boolean isEqualsParentId(Object p1,Object p2){ if(p1!=null && p1!=null){ return p1.equals(p2); }else if(p1==null && p2 == null) { return true; }else if(p1==null && p2 != null) { if("".equals(p2.toString())){ return true; }else{ return false; } }else if(p1!=null && p2 == null) { if("".equals(p1.toString())){ return true; }else{ return false; } }else{ return false; } } /** * 根据父节点的ID获取全部子节点,该方法顶级节点必须为空 * @param list 分类表 * @param parentId 传入的父节点ID * @return String */ public List<TreeObject> getChildTreeObjects(List<TreeObject> list,Object parentId) { List<TreeObject> returnList = new ArrayList<TreeObject>(); if(list!=null&&list.size()>0) { for (Iterator<TreeObject> iterator = list.iterator(); iterator.hasNext(); ) { TreeObject t = (TreeObject) iterator.next(); // 1、根据传入的某个父节点ID,遍历该父节点的全部子节点 if (isEqualsParentId(t.getParentId(), parentId)) { recursionFn(list, t); returnList.add(t); } } if(returnList==null||returnList.size()==0){//若是返回出空结果,则说明非树,直接返回原来结果 for (Iterator<TreeObject> iterator = list.iterator(); iterator.hasNext(); ) { TreeObject t = (TreeObject) iterator.next(); returnList.add(t); } } } return returnList; } /** * 根据父节点的ID获取全部子节点,该方法顶级节点能够不为空,非树直接返回 * @param list 分类表 * @return String */ public List<TreeObject> getChildTreeObjects(List<TreeObject> list) { if(list!=null&&list.size()>0) { List<TreeObject> topList=new ArrayList<>(); List<TreeObject> subList=new ArrayList<>(); Map<String,String> idMap=new HashMap<>(); for (Iterator<TreeObject> iterator = list.iterator(); iterator.hasNext(); ) { //归并全部list的id集合 TreeObject t = (TreeObject) iterator.next(); if(t.getId()!=null){ idMap.put(t.getId().toString(), t.getId().toString()); } } for (Iterator<TreeObject> iterator = list.iterator(); iterator.hasNext(); ) { //获取最顶级的list TreeObject t = (TreeObject) iterator.next(); if(t.getParentId()==null||StringUtils.isEmpty(t.getParentId().toString())){ topList.add(t); }else{ String id=idMap.get(t.getParentId().toString()); if(StringUtils.isEmpty(id)){ topList.add(t); }else{ subList.add(t); } } } if(topList!=null&&topList.size()>0&&subList!=null&&subList.size()>0){ List<TreeObject> resultList=new ArrayList<>(); for (TreeObject t:topList) { //将儿子级别的list归并到顶级中 List<TreeObject> subOneList=new ArrayList<>(); for (TreeObject sub:subList) { // 1、根据传入的某个父节点ID,遍历该父节点的全部子节点 if (isEqualsParentId(sub.getParentId(), t.getId())) { recursionFn(subList, sub); subOneList.add(sub); } } if(subOneList!=null&&subOneList.size()>0) { t.setChildren(subOneList); } resultList.add(t); } return resultList; }else{ return list; } } return list; } /** * 递归列表 * @author lanyuan * Email: mmm333zzz520@163.com * @date 2013-12-4 下午7:27:30 * @param list * @param t */ private void recursionFn(List<TreeObject> list, TreeObject t) { List<TreeObject> childList = getChildList(list, t);// 获得子节点列表 t.setChildren(childList); for (TreeObject tChild : childList) { if (hasChild(list, tChild)) {// 判断是否有子节点 //returnList.add(TreeObject); Iterator<TreeObject> it = childList.iterator(); while (it.hasNext()) { TreeObject n = (TreeObject) it.next(); recursionFn(list, n); } } } } // 获得子节点列表 private List<TreeObject> getChildList(List<TreeObject> list, TreeObject t) { List<TreeObject> tlist = new ArrayList<TreeObject>(); Iterator<TreeObject> it = list.iterator(); while (it.hasNext()) { TreeObject n = (TreeObject) it.next(); if (isEqualsParentId(n.getParentId(),t.getId())) { tlist.add(n); } } return tlist; } List<TreeObject> returnList = new ArrayList<TreeObject>(); /** * 根据父节点的ID获取全部子节点 * @param list 分类表 * @param parentId 传入的父节点ID * @param prefix 子节点前缀 */ public List<TreeObject> getChildTreeObjects(List<TreeObject> list, Object parentId,String prefix){ if(list == null) return null; for (Iterator<TreeObject> iterator = list.iterator(); iterator.hasNext();) { TreeObject node = (TreeObject) iterator.next(); // 1、根据传入的某个父节点ID,遍历该父节点的全部子节点 if (isEqualsParentId(node.getParentId(),parentId)) { recursionFn(list, node,prefix); } // 2、遍历全部的父节点下的全部子节点 /*if (node.getParentId()==0) { recursionFn(list, node); }*/ } return returnList; } private void recursionFn(List<TreeObject> list, TreeObject node,String p) { List<TreeObject> childList = getChildList(list, node);// 获得子节点列表 if (hasChild(list, node)) {// 判断是否有子节点 returnList.add(node); Iterator<TreeObject> it = childList.iterator(); while (it.hasNext()) { TreeObject n = (TreeObject) it.next(); n.setName(p+n.getName()); recursionFn(list, n,p+p); } } else { returnList.add(node); } } // 判断是否有子节点 private boolean hasChild(List<TreeObject> list, TreeObject t) { return getChildList(list, t).size() > 0 ? true : false; } // 本地模拟数据测试 public void main(String[] args) { /*long start = System.currentTimeMillis(); List<TreeObject> TreeObjectList = new ArrayList<TreeObject>(); TreeObjectUtil mt = new TreeObjectUtil(); List<TreeObject> ns=mt.getChildTreeObjects(TreeObjectList,0); for (TreeObject m : ns) { System.out.println(m.getName()); System.out.println(m.getChildren()); } long end = System.currentTimeMillis(); System.out.println("用时:" + (end - start) + "ms");*/ } }
2.新建类TreeObjectnode
package com.zdnst.common.infra.utils; import java.util.List; /** * 这个是列表树形式显示的接口 */ public interface TreeObject { public Object getId(); public void setId(Object id); public Object getParentId(); public void setParentId(Object parentId); public String getName(); public void setName(String name); public List getChildren(); public void setChildren(List children); }
3.具体列表实体PubCompTypeDto实现TreeObject :app
package com.zdnst.core.sys.application.dto; import com.zdnst.common.infra.dto.BaseDto; import com.zdnst.common.infra.utils.TreeObject; import java.util.List; public class PubCompTypeDto extends BaseDto implements TreeObject { private static final long serialVersionUID = 5726287409752473211L; private String comTypeItemCode;//公司类型CODE,由类型key+具体code组合 private String comTypeItemName;//类型项名称 private String comTypeItemDesc;//类型项描述 private String parentCode;//父id private Long comTypeItemStatus;//1启用0停用 /** * 类型KEY: * 环节:FN_LEAVE_CODE * 物品:FN_GOODS_CODE * 场地:FN_FIELD_CODE * 车辆:FN_CAR_CODE */ private String comTypeKey; private String companyId;//公司id private Long seqNo; private List children;//构造树使用 public String getComTypeItemCode() { return comTypeItemCode; } public void setComTypeItemCode(String comTypeItemCode) { this.comTypeItemCode = comTypeItemCode == null ? null : comTypeItemCode.trim(); } public String getComTypeItemName() { return comTypeItemName; } public void setComTypeItemName(String comTypeItemName) { this.comTypeItemName = comTypeItemName == null ? null : comTypeItemName.trim(); } public String getComTypeItemDesc() { return comTypeItemDesc; } public void setComTypeItemDesc(String comTypeItemDesc) { this.comTypeItemDesc = comTypeItemDesc == null ? null : comTypeItemDesc.trim(); } public String getParentCode() { return parentCode; } public void setParentCode(String parentCode) { this.parentCode = parentCode == null ? null : parentCode.trim(); } public Long getComTypeItemStatus() { return comTypeItemStatus; } public void setComTypeItemStatus(Long comTypeItemStatus) { this.comTypeItemStatus = comTypeItemStatus; } public String getComTypeKey() { return comTypeKey; } public void setComTypeKey(String comTypeKey) { this.comTypeKey = comTypeKey == null ? null : comTypeKey.trim(); } public String getCompanyId() { return companyId; } public void setCompanyId(String companyId) { this.companyId = companyId == null ? null : companyId.trim(); } public Long getSeqNo() { return seqNo; } public void setSeqNo(Long seqNo) { this.seqNo = seqNo; } @Override public Object getId() { return getComTypeItemCode(); } @Override public void setId(Object id) { setComTypeItemCode((String)id); } @Override public Object getParentId() { return getParentCode(); } @Override public void setParentId(Object parentId) { setParentCode((String)parentId); } @Override public String getName() { return getComTypeItemName(); } @Override public void setName(String name) { setComTypeItemName(name); } @Override public List getChildren() { return this.children; } @Override public void setChildren(List children) { this.children = children; } }
4.在使用中以下调用:ide
TreeUtil treeUtil = new TreeUtil(); List<TreeObject> treeList = treeUtil.getChildTreeObjects(pubCompTypeDtoList); return JsonView.dataToJson(treeList, response);