java 3级分类递归

数据库结构

CREATE TABLE `category` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `sort` int(11) NOT NULL DEFAULT '0',
  `parent_id` int(11) DEFAULT '0',
  `level` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;

 

分类

public class TreeView {
    private List<Category> data = new ArrayList<Category>(); // 传入的数据
    public TreeView(List<Category> data)
    {
        this.data = data;
    }

    /**
     * 以树形分级的形式获取列表
     * @return
     */
    public List<Category> makeTree()
    {
        List<Category> tree = new ArrayList<Category>();
        List<Category> root = getRootCategory();
        for(Category category:root) {
            category = getChildrenTree(category);
            tree.add(category);
        }
        return tree;
    }

    /**
     * 以列表的形式获取列表
     * @return
     */
    public List<Category> makeList()
    {
        List<Category> tree = new ArrayList<Category>();
        List<Category> root = getRootCategory();
        for(Category category:root) {
            tree.add(category);
            tree.addAll(getChildList(category));
        }
        return tree;
    }

    /**
     * 跟传入的分级获取当前级以及所有上级,并且获取当前级选中的值
     * @param category
     * @return
     */
    public Map<Integer, List<Category>> getCurrentAndParents(Category category)
    {
        // Integer 表示选中项, List<Category>表示父级列表,为了保证顺序,这里使用TreeMap
        Map<Integer, List<Category>> currentAndParent = new TreeMap<Integer, List<Category>>();
        // 如果已经是顶级分类, 直接获取顶级分类
        if (category.getParentId() == 0) {
            List<Category> cParent = new ArrayList<Category>();
            for(Category cate : data) {
                if (cate.getParentId() == 0) {
                    cParent.add(cate);
                }
            }
            Integer id = Integer.valueOf(category.getId());
            currentAndParent.put(id, cParent);
            return currentAndParent;
        }
        // 如果不是顶级分类,则先获取父级id
        // 第一个Integer 保存当前选中的值, 第二个Integer保存当前的父级id
        Map<Integer, Integer> ids = new TreeMap<Integer, Integer>();
        //  向上获取parent_id
        ids.put(category.getId(), category.getParentId());
        getParents(category, ids);

        for(Map.Entry<Integer, Integer> id : ids.entrySet()) {
            List<Category> parents = new ArrayList<Category>();
            for(Category cate : data) {
                if (cate.getParentId() == id.getValue()) {
                    parents.add(cate);
                }
            }
            currentAndParent.put(id.getKey(), parents);
        }
        if(currentAndParent.size() > 0) {
            return currentAndParent;
        }

        return null;
    }

    /**
     * 以树形的形式获取子分类
     * @param parent
     * @return
     */
    private Category getChildrenTree(Category parent)
    {
        List<Category> children = new ArrayList<Category>();
        for(Category category:data) {
            if (category.getParentId() == parent.getId()) {
                children.add(getChildrenTree(category));
            }
        }
        parent.setChildren(children);
        return parent;
    }

    /**
     * 以列表的形式获取子分类
     * @param parent
     * @return
     */
    private List<Category> getChildList(Category parent)
    {
        List<Category> children = new ArrayList<Category>();
        for(Category category:data) {
            if (category.getParentId() == parent.getId()) {
                children.add(category);
                children.addAll(getChildList(category));
            }
        }
        return children;
    }

    /**
     * 获取顶级分类
     * @return
     */
    private List<Category> getRootCategory()
    {
        List<Category> root = new ArrayList<Category>();
        for(Category category:data) {
            if (category.getParentId() == 0) {
                root.add(category);
            }
        }
        return root;
    }

    /**
     * 根据当前级获取上级的id以及当前级选中的id
     * @param category
     * @param ids
     * @return
     */
    private Map<Integer, Integer> getParents(Category category, Map<Integer, Integer> ids)
    {
        for(Category cate:data) {
            if (category.getParentId() == cate.getId()) {
                Integer id = Integer.valueOf(cate.getId());
                Integer parentId = Integer.valueOf(cate.getParentId());

                ids.put(id, parentId);
                if (!parentId.equals(Integer.valueOf(0))) {
                    getParents(cate, ids);
                }
            }
        }
        return ids;
    }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值