博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
List 无限分类生成树结构
阅读量:6282 次
发布时间:2019-06-22

本文共 3500 字,大约阅读时间需要 11 分钟。

hot3.png

 在处理无限树分类中,因为子类中的pid 是重复出现的,所以在获取所有子类的父类时使用了list.contains来判断父类是否已经保存在,如果存在,则不往list中添加,来过滤重复的pid,得到一个唯一的pid列表。为了能正确判断是否存丰父类,重写了AllTree的equals方法。

AllTree实现Comparable接口为了给树排序用,但此处并没有用来排序,感觉这样排序来代码量大,不如在数据表中直接用sql语名根据一定的规则先把所有的树排好序来的简单。

经过测试,总体还算基本满意,能完成我项目 的

 

package cn.guhai.tree.test;//树对象public class AllTree implements Comparable
{ private int id; private String name; private int pid; @Override public String toString() { return "AllTree [id=" + id + ", name=" + name + ", pid=" + pid + "]"; } //重写equals方法,过滤重复的父类时使用 //在使用list.contains()方法会调用此方法比较 @Override public boolean equals(Object obj) { AllTree at = (AllTree) obj; //业务需要:当前的pid等于传过来的id时,即说明父类对象已经add到了list中 if(this.pid==at.id){ return true; } return false; } public AllTree() { super(); // TODO Auto-generated constructor stub } public AllTree(int id, String name, int pid) { super(); this.id = id; this.name = name; this.pid = pid; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } @Override public int compareTo(AllTree at) { return (this.id>at.id)?1:((this.id

 

package cn.guhai.tree.test;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import org.junit.Before;import org.junit.Test;public class AllTreeService { private List
at ; @Before public void listTree(){ at= new ArrayList
(); at.add(new AllTree(1,"A父栏目",0)); at.add(new AllTree(2,"B父栏目",0)); at.add(new AllTree(4,"A子栏目",1)); at.add(new AllTree(5,"A子栏目",1)); at.add(new AllTree(7,"B子栏目",2)); at.add(new AllTree(8,"B子栏目",2)); at.add(new AllTree(9,"B子栏目",2)); at.add(new AllTree(3,"A子栏目",1)); at.add(new AllTree(6,"A子栏目",1)); at.add(new AllTree(11,"B9子栏目",9)); at.add(new AllTree(12,"B9子栏目",9)); at.add(new AllTree(10,"B9子栏目",9)); at.add(new AllTree(13,"B2子栏目",2)); at.add(new AllTree(14,"B2子栏目",2)); at.add(new AllTree(15,"B2子栏目",2)); at.add(new AllTree(16,"B2子栏目",2)); } /** * * @param parentTree 父节点树 * @param ats 所有的树 * @param pids 所有树父类 ID * @param tree 已经保存的树结构,初始传入时为null */ public List
listChildren(AllTree parentTree ,List
ats ,List
pids,List
tree){ if(tree==null){ tree = new ArrayList
(); } for(AllTree atr :ats){ if(atr.getPid()!=0){ if(atr.getPid()==(parentTree.getId())){ tree.add(atr); //如果父类树列表中包含当前树节点 if(pids.contains(atr.getPid())){ List
pbs = pids; pbs.remove(Integer.valueOf(atr.getId())); //递归再进行处理 listChildren(atr , ats ,pbs,tree ); } } } } return tree; } /** * 获取所有父类 * @param ats 所有分类 父和子 * @return */ public List
listParent(List
ats ){ List
ptrees = new ArrayList
(); for(AllTree at :ats){ if(!ptrees.contains(at)){ ptrees.add(at); } } return ptrees; } /** * 获取所有父节点的ID值 * @param ats * @return */ private List
getParentids(List
ats) { List
pids = new ArrayList
(); for(AllTree a : ats){ pids.add(a.getId()); } return pids; } @Test public void getTrees(){ List
atree = new ArrayList
(); List
ats= listParent( at ); Iterator
atsiter = ats.iterator(); while (atsiter.hasNext()){ AllTree aa= atsiter.next(); List
pids = getParentids(ats); List
tree = null; tree = listChildren(aa,at,pids,null); if(tree.size()>1){ tree.add(0,aa); } atree.addAll(tree); } System.out.println(atree); } }

 

 

 

转载于:https://my.oschina.net/guhai2004/blog/345066

你可能感兴趣的文章
小五思科技术学习笔记之扩展访问列表
查看>>
使用Python脚本检验文件系统数据完整性
查看>>
使用MDT部署Windows Server 2003 R2
查看>>
Redhat as5安装Mysql5.0.28
查看>>
通过TMG发布ActiveSync
查看>>
Web服务器的配置与管理(4) 配置访问权限和安全
查看>>
2019年BAT面试通关宝典:数据结构+JVM+并发编程+分布式...
查看>>
CMarkupSTL 读写xml文件
查看>>
洛谷——P3119 [USACO15JAN]草鉴定Grass Cownoisseur
查看>>
codevs——1842 递归第一次
查看>>
转给正在找工作的应届生 2013年各大小IT公司待遇
查看>>
某源码thread,socket研究4
查看>>
tomcat日志脚本
查看>>
mysql修改表、字段、库的字符集
查看>>
设置Serv-U FTP 支持被动模式连接 ,530错误等解决办法集锦
查看>>
zabbix3.0安装教程(环境)
查看>>
关于linux系统下批量修改文件名和后缀
查看>>
我和linux的第二十四天
查看>>
互联网公司的分布排行
查看>>
'latin-1' codec can't encode characters……
查看>>