本发明涉及软件开发技术领域,具体涉及一种快速缕清和组装数据父子上下关系列表的方法。
背景技术:
在软件开发领域,经常碰到父子上下关系的列表需要进行缕清和关联相互间的联系,比如:商城里的类别关系菜单、评论里的相互留言等等。每个菜单(评论)都涉及到是否有上一级(父级)菜单(评论)或者下一级(子级)菜单。现有的解决方案中,有些需要多次访问数据库来缕清关联关系,有些一次访问数据库但需要进行多次循环遍历来缕清关联关系。不管是哪种现有方案,都极大地耗费了资源和时间。
技术实现要素:
本发明解决的技术问题是提供一种快速缕清和组装数据父子上下关系列表的方法;可以极大降低耗费的资源和时间。
本发明解决前述技术问题的技术方案是:由以下步骤实现所述方法:
步骤一、准备需要装配的数据列表l;
步骤二、创建一个以对象的parentid属性为key,list<对象>为value的辅助map,并命名childrenmap;用于存储父节点与子节点的关系;
步骤三、创建一个以对象的id属性为key,此对象为value的辅助map,并命名selfmap;用于存储对象的id与对象自己的对应关系;
步骤四、循环遍历步骤一的数据列表l,遍历所得当前对象命名为object,并为object设置步骤一数据列表l的children属性;
步骤五、为步骤四的object设置步骤一数据列表l的parent属性。
更进一步的,所述的数据列表l来源包括:从数据库查询或者从程序中传递;数据列表l中的每条数据都包括:parentid属性,用于保存父节点的id;children属性,用于保存子节点数据列表;parent属性,用于保存父节点数据。
更为具体的,所述的步骤四包括如下步骤:
s41,得到遍历所得object的parentid,parentid为空时默认为0,不为空时为其本身;
s42,将步骤四的object对象保存到selfmap;
s43,取得步骤四的object所有兄弟列表sl,并判断列表sl,当sl等于null时,创建一个空列表并且赋值给sl;
s44,将步骤四的object保存到s43的列表sl里;
s45,把s43的列表sl保存到辅助childrenmap里;
s46,取得步骤四object的孩子列表currentcl,并判断列表currentcl,当currentcl等于null时,创建一个空列表并且赋值给currentcl;
s47,设置步骤四object的数据列表l的children属性;
s48,保存s46列表currentcl到步骤二的childrenmap。
所述的步骤五更为具体的包括如下步骤:
s51、循环遍历步骤一的数据列表l,所得当前对象命名为currentobject,并取得currentobject的parentid;
s52、从步骤三的selfmap中获取s51currentobject的父级对象parentobject;
s53、将s52parentobject保存到s51currentobject中的数据列表l的parent属性里。
所述的map为基于stl的一个关联容器。
本发明的方法是利用数据列表中数据的parentid属性、children属性和parent属性,通过map建立父节点与子节点的关系、对象的id与对象自己的对应关系,然后,为对象设置children属性和parent属性;从而缕清和组装数据(对象)的父子关系。本发明方法在实现过程中无需多次访问数据库,也不需要进行多次循环遍历来缕清关联关系。
附图说明
下面结合附图对本发明进一步说明:
图1是本发明方法步骤流程图;
图2是步骤四的分解步骤流程图;
图3是步骤五的分解步骤流程图。
具体实施方式
见图1所示,是本发明快速缕清和组装数据父子上下关系列表方法的流程图;本发明的实现流程如下:
步骤一、准备需要装配的数据列表l。数据列表来源:从数据库查询或者从程序中传递。列表中的每条数据(或者说对象)都必须包括:parentid(父id)属性,该字段用于保存父节点的id;children(子)属性,此字段用于保存子节点数据列表;parent属性,此字段用于保存父节点数据。例如:菜单列表list<menu>,一个menu对象就是一条数据,且menu对象里面有一个parentid属性、children属性、parent(父)属性。
步骤二、创建一个以对象的parentid属性为key(键),list<对象>为value(值)的辅助map(基于stl的一个关联容器),并命名childrenmap。所述childrenmap用于存储父节点与子节点的关系。
步骤三、创建一个以对象的id属性为key(键),此对象为value(值)的辅助map,并命名selfmap。所述selfmap用于存储对象的id与对象自己的对应关系。
步骤四、循环遍历步骤一所述数据列表l,遍历所得当前对象命名为object,并为object设置步骤一所述的children属性。如图2所示,具体步骤如下:step41,得到遍历所得对象object的parentid。parentid为空时默认为0,不为空时为其本身。step42,将步骤四首句所述object对象保存到selfmap。具体保存如:selfmap.put(object.getid,object)。step43,取得步骤四首句所述object所有兄弟列表sl,并判断列表sl,当sl等于null时,创建一个空列表并且赋值给sl。具体如:sl=childrenmap.get(parentid);if(sl==null)sl=newarraylist;。step44,将步骤四首句所述对象object保存到step43所述列表sl里。具体如:sl.add(object);。step45,把step43所述列表sl保存到辅助childrenmap里。具体如:childrenmap.put(parentid,sl);。step46,取得步骤四首句所述object的孩子列表currentcl,并判断列表currentcl,当currentcl等于null时,创建一个空列表并且赋值给currentcl。具体如:currentcl=childrenmap.get(id);if(currentcl==null)currentcl=newarraylist。step47,设置步骤四首句所述对象object的步骤一所述的children属性。具体如:object.setchildren(currentcl);。step48,保存step46所述列表currentcl到步骤二所述childrenmap。具体如:childrenmap.put(id,currentcl);。
步骤五、为步骤四首句所述的object设置步骤一所述的parent属性。具体步骤如下:step51、循环遍历步骤一所述数据列表l,所得当前对象命名为currentobject,并取得currentobject的parentid。step52、从步骤三所述的selfmap中获取step51所述的currentobject的父级对象parentobject。具体如:parentobject=parentid==null?null:selfmap.get(parentid);。step53、将step52所述parentobject保存到step51所述currentobject中的步骤一所述的parent属性里。具体如:currentobject.setparent(parentobject);。