关于多级分类的封装

现在在公司用到了关于多级分类的菜单树,关于封装成树形结构传给前端,下面提供几个方式:

1:传统封装:每一级循环一次得到该子类

    @Override
    public List<Map<String, Object>> getCatalist(Integer sch_id) {
        //得到一级导航
        List<Map<String, Object>> list = courseDao.getCatalist(sch_id,0);
        //循环一级分类
        for(Map<String, Object> map :list){
            //获得一级分类的id值作为二级分类的父id
            Integer p_id = (Integer) map.get("p_code");
            //得到二级分类
            List<Map<String, Object>> list2 = courseDao.getCatalist(sch_id,p_id);
            if(list2 != null && list2.size()>0){
                map.put("child", list2);
            }

            //循环二级分类
            for(Map<String, Object> map2 :list2){
                //获得二级分类的id值作为三级分类的父id
                Integer p_id2 = (Integer) map2.get("p_code");
                //得到二级分类
                List<Map<String, Object>> list3 = courseDao.getCatalist(sch_id,p_id2);
                if(list3 != null && list.size()>0){
                    map2.put("child", list3);
                }
            }

        }
        return list;
    }

2:递归封装

由于树形菜单的表示根据p_id来建立父子关系的,首先可以查询所有的菜单信息,不区分父子

    @Override
    public List<CatagoryTree> getCatagory() {
        String sql = " SELECT cc.id,cc.p_id AS pid,cc.name AS cataname ,cc.sort_index , cc.status,cc.is_visable_nav nav FROM y_crs_catagory cc WHERE cc.sch_id=? ORDER BY sort_index";
        List<Map<String, Object>> list = jdbcTemplateBaseDao.getSelectForList(sql, "9999");

        List<CatagoryTree> cataDatas = new ArrayList<CatagoryTree>();
        if(list!=null){
            for(Map<String, Object> map : list){
                CatagoryTree cataTree = new CatagoryTree();
                cataTree.setId(String.valueOf(map.get("id")));
                cataTree.setName(String.valueOf(map.get("cataname")));
                cataTree.setPrientId(String.valueOf(map.get("pid")));
                cataTree.setSortIndex(String.valueOf(map.get("sort_index")));
                cataTree.setStatus(String.valueOf(map.get("status")).equals("true")?true:false);
                cataTree.setNav(String.valueOf(map.get("nav")).equals("true")?true:false);
                cataDatas.add(cataTree);
            }
            cataDatas=TreeUtils.treeCatagory(cataDatas, "0");
        }
        return cataDatas;
    }

上面是将查询的所有分类信息封装成对象的集合cataDatas传入到分类树方法treeCatagory中做处理

public static List treeCatagory(List treeDataList, String parentID) {
    List list = null;
    CatagoryTree catagoryTree = null;
    if (treeDataList != null && treeDataList.size() > 0) {
        try {
            for (int i = 0; i < treeDataList.size(); i++) {
                catagoryTree = (CatagoryTree) treeDataList.get(i);
                if (catagoryTree.getPrientId().equals(parentID)) {
                    catagoryTree.setChild(treeCatagory(treeDataList, catagoryTree.getId()));

                    if (list == null) {
                        list = new ArrayList();
                    }
                    list.add(catagoryTree);
                }
            }
        } catch (Exception e) {
            // TODO: handle exception
            logger.error(catagoryTree.getName() + " 菜单,没有父节点");
            e.printStackTrace();
        }
    }

    return list;
}

采用递归方式封装成树

------------------------------------------------------------------------------------------------------------------------------

在这里写一个对list中的map集合进行排序的功能

sortField是map中需要排序的字段名

sortType是排序方式  asc或者desc

    public static final List<Map<String, Object>> getSortedResult(List<Map<String, Object>> list, final Object sortField, final String sortType) {
        if(null != list && list.size() != 0 && null != sortField){
            if("asc".equalsIgnoreCase(sortType) || "desc".equalsIgnoreCase(sortType)){
                Collections.sort(list,new Comparator<Map<String,Object>>() {
                    @Override
                    public int compare(Map<String, Object> o1, Map<String, Object> o2) {
                        if("asc".equalsIgnoreCase(sortType))
                            // 升序
                            return o1.get(sortField).toString().compareTo(o2.get(sortField).toString());
                        else
                            // 降序
                            return o2.get(sortField).toString().compareTo(o1.get(sortField).toString());
                    }
                });
            }
        }
        return list;
    }
}
时间: 2024-08-25 21:25:55

关于多级分类的封装的相关文章

(转)smarty实现多级分类的方法

--http://www.aspku.com/kaifa/php/44679.html 这篇文章主要介绍了smarty实现多级分类的方法,涉及循环读取的技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了smarty实现多级分类的方法.分享给大家供大家参考.具体分析如下: 这里简单的介绍一下利用php smarty 多级分类读出与循环方法,单循环很简单,但是多级就要复杂一点,下面我们来看看,感兴趣的朋友可以看来一下: 复制代码代码如下: <?php$result=mysql_query(

SQLite中使用CTE巧解多级分类的级联查询

在最近的活字格项目中使用ActiveReports报表设计器设计一个报表模板时,遇到一个多级分类的难题:需要将某个部门所有销售及下属部门的销售金额汇总,因为下属级别的层次不确定,所以靠拼接子查询的方式显然是不能满足要求,经过一番实验,利用了CTE(Common Table Expression)很轻松解决了这个问题! 举例:有如下的部门表 以及员工表 如果想查询所有西北区的员工(包含西北.西安.兰州),如下图所示: 如何用CTE的方式实现呢? Talk is cheap. Show me the

SQL处理多级分类,查询结果呈树形结构

对于多级分类常规的处理方法,很多程序员可能是用程序先读取一级分类记录,然后通过一级分类循环读取下面的子分类 这样处理的弊端是:如果数据量大,子分类很多,达到4级以上,这方法处理极端占用数据库连接池 对性能影响很大. 如果用SQL下面的CTE递归处理的话,一次性就能把结果给查询出来,而且性能很不错 比用程序处理(数据量很大的情况),临时表性能更好,更方便 with area as(select *,id px,cast(id as nvarchar(4000)) px2 from region w

EXCEL中多级分类汇总空白字段填充

使用场景,多级分类汇总后,在汇总的字段中显示空白,这样对我们直接取值做表带来十分不更(假像有5000条记录,1000条汇总项) 相关技术,INDIRECT函数,单元格定位功能. 在数据区域外任意一个单元格编辑好INDIRECT函数,=INDIRECT(ADDRESS(ROW()-1,COLUMN(),4)),如下图 先选择好上面编辑好函数的单元格,并复制,接下来选择好需要填充的空白字段,再时行定位操作,如下图          选择好空白单元格后,直接按下ctrl+v,如下图完工. 效果图

数据库多级分类代码(MSSQL存储过程版)

说明 相信多级分类在任何一个信息系统中都会用到,网上也能找到很多版本,下面这个是基于MSSQL存储过程版的, 手上还有VB跟C#版的,不过这几年数据库一直用MSSQL,编程语言却从VBScript到C#又到PB, 搞到现在这套分类代码分别用VB.C#.PB实现了一遍,浪费了不少时间,NND神马多数据库啊!!!哥被忽悠了. 分类采用前缀编码的方式,编码使用字符串类型的,当然也有使用二进制实现的牛人^_^. 表结构说明(表Category,ClassId,ClassName,Code 为分类相关字段

Select显示多级分类列表

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>在下拉列表中显示的多级树形菜单</t

大量多级分类数据的获取、缓存、搜索查询 怎么设计最快 ?

1.数据量大2.多级分类3.首先要获取所有数据4.获取到所有数据后 有搜索功能(搜索到的数据不管几级都要获取到它的所有父级和子级 存在和搜索名称相符合的标为红色) 现在我为了开始获取全部数据和后期搜索都用一个方法 我就获取到所有分类id和其父级子集放在一起 然后比如现在不是搜索 开始是全部数据肯定很多重复的 我去重 然后通过这些id去获取所有信息 最后再循环改变搜索相符的字体颜色(和搜索公用) 最后再循环组合成树状结构数据 因为数据量大的话 老循环我感觉可能会慢 怎么优化下 搜索和初始化所有数据

使用PopupWindow + 2个ListView实现仿 美团/淘宝/百度糯米 多级分类菜单效果

本例要实现的是诸如美团/淘宝/百度糯米 多级分类菜单效果.当分类数量非常多时可以考虑采用两级分类,而诸如美团这种表现方式是一个不错的选择. 首先上效果图:      主要代码: 1. PopupWindow初始化过程: popupWindow = new PopupWindow(this); View view = LayoutInflater.from(this).inflate(R.layout.popup_layout, null); leftLV = (ListView) view.fi

PHPTree——快速生成无限多级分类

在开发中经常需要用到树形数据,比如无限多级分类,就是典型的树形结构.这里面的算法,用到了递归思想,为了简化开发过程,我编写了一个工具来提升开发效率, 它就是PHPTree. git地址:https://git.oschina.net/jiusem/PHPTree.git 使用方法: <?php  require('PHPTree.class.php'); //原始数据, 从数据库读出 $data = array( array( 'id'=>1, 'name'=>'book', 'pare