Java构建树形菜单工具类,递归写法

java实现数据拼接实现el-tree前端展示 项目前几天的一个问题,今天跟同事一起研究了下解决了,多少还算是个痛点,记录一下 首先我们是准备在el-tree的结构进行前端的展示 首先看一下element-ui的el-tree展示 <el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick"></el-tree> <script> export default { data() { return { 阅读详情

树形菜单构建工具类(递归写法)

1. 工具类源码

模型定义,这里受Spring Security的UserService启发,给model设置接口.想要使用此工具类的话,实现此接口即可.

package xyz.yq56.easytool.abs;

import java.util.List;

/**
 * @author yi qiang
 * @date 2021/10/5 14:35
 */
public interface TreeNode {

    /**
     * 获取id
     *
     * @return id
     */
    String getId();

    /**
     * 获取父类id
     *
     * @return 父类id
     */
    String getPid();

    /**
     * 获取子类集合
     *
     * @return 子类集合
     */
    <T extends TreeNode> List<T> getChildren();

    /**
     * 设置子类集合
     *
     * @param children 子类集合
     */
    <T extends TreeNode> void setChildren(List<T> children);

}

工具类源码:

package xyz.yq56.easytool.utils.recursion;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import xyz.yq56.easytool.abs.TreeNode;
import xyz.yq56.easytool.utils.collection.CollectUtil;

/**
 * @author yi qiang
 * @date 2021/10/5 14:33
 */
public class RecursionUtil {

    private RecursionUtil() {}

    /**
     * 使用时,只要node实现TreeNode接口即可实现树形菜单
     * <br> 实现逻辑很简单:
     * <br> 找到子类,并给children设值
     * <br> 由于子类可能还有子类,故在子类内部递归调用,找到子类的子类
     *
     * @param list 树形结构的扁平数据
     * @param node 根节点
     * @param <T>  泛型,只要实现TreeNode接口即可生成树形结构
     */
    public static <T extends TreeNode> void buildTree(List<T> list, T node) {
        if (CollectUtil.isEmpty(list)) {
            return;
        }
        List<T> children = new ArrayList<>();
        for (T menu : list) {
            if (Objects.equals(menu.getPid(), node.getId())) {
                children.add(menu);
                buildTree(getRemainList(list, menu.getPid()), menu);
            }
        }
        if(!CollectUtil.isEmpty(children)){
            node.setChildren(children);
        }

    }

    /**
     * 获取到的剩余集合会越来越少,避免堆栈溢出
     *
     * @param list list
     * @param pid  pid
     * @return 剩余集合
     */
    private static <T extends TreeNode> List<T> getRemainList(List<T> list, String pid) {
        return CollectUtil.filter(list,item -> !Objects.equals(item.getPid(), pid));
    }
}

2. 使用示例

实现TreeNode接口

package xyz.yq56.sm.module.menu.model;

import java.util.List;

import lombok.Data;
import xyz.yq56.easytool.abs.TreeNode;

/**
* @author yi qiang
* @date 2021/10/4 0:03
*/
@Data
public class MenuVo implements TreeNode {

  private String id;

  private String pid;

  private String name;

  private String path;

  private String icon;

  private List<MenuVo> children;

  @Override
  public <T extends TreeNode> void setChildren(List<T> list) {
      this.children = (List<MenuVo>) list;
  }
}

service层代码: 直接使用RecursionUtil.buildTree方法即可

package xyz.yq56.sm.module.menu.service.impl;

import java.util.List;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import xyz.yq56.easytool.utils.collection.CollectUtil;
import xyz.yq56.easytool.utils.nvll.NullUtil;
import xyz.yq56.easytool.utils.recursion.RecursionUtil;
import xyz.yq56.sm.module.menu.model.Menu;
import xyz.yq56.sm.module.menu.model.MenuVo;
import xyz.yq56.sm.module.menu.service.MenuBizService;
import xyz.yq56.sm.module.menu.service.MenuService;

/**
 * @author yi qiang
 * @date 2021/10/4 0:18
 */
@Service
public class MenuBizServiceImpl implements MenuBizService {

    @Autowired
    private MenuService menuService;

    @Override
    public MenuVo getMenu(String pid) {
    	//拿到菜单原始数据
        List<Menu> list = menuService.list();
        //拿到菜单原始数据,转化为vo集合
        List<MenuVo> menuVoList = CollectUtil.mapToOtherList(list, item -> {
            MenuVo menuVo = new MenuVo();
            BeanUtils.copyProperties(item, menuVo);
            return menuVo;
        });
        //如果指定了特定节点,那么特定节点为根节点,没有的话就默认null的是根节点
        Menu byId = menuService.getById(pid);
        MenuVo menuVo = new MenuVo();
        NullUtil.apply(byId, item -> {
            BeanUtils.copyProperties(item, menuVo);
            return null;
        });

		//构建以menuVo为根节点的树形结构
        RecursionUtil.buildTree(menuVoList, menuVo);
        return menuVo;
    }

}

controller


/**
 * @author yi qiang
 * @date 2021/10/4 0:14
 */
@RestController
@RequestMapping("/menu/biz/")
public class MenuBizController {

    @Autowired
    MenuBizService menuBizService;

    @GetMapping("getMenu")
    public MenuVo getMenu(String pid) {
        return menuBizService.getMenu(pid);
    }

}

请求效果

不指定特定节点时,以null为根节点.日常使用,可以直接拿根节点的children作为菜单也可.

http://localhost:8080/menu/biz/getMenu

{
    "code": 200,
    "data": {
        "id": null,
        "pid": null,
        "name": null,
        "path": null,
        "icon": null,
        "children": [
            {
                "id": "1445371079417503745",
                "pid": null,
                "name": "用户管理",
                "path": "/user",
                "icon": "el-icon-user",
                "children": [
                    {
                        "id": "1445372598120456194",
                        "pid": "1445371079417503745",
                        "name": "用户信息",
                        "path": "/user_info",
                        "icon": "el-icon-s-custom",
                        "children": null
                    },
                    {
                        "id": "1445405355609530370",
                        "pid": "1445371079417503745",
                        "name": "用户列表",
                        "path": "/users",
                        "icon": "el-icon-s-custom",
                        "children": null
                    }
                ]
            },
            {
                "id": "1445372340355309569",
                "pid": null,
                "name": "菜单管理",
                "path": "/menu",
                "icon": "el-icon-menu",
                "children": null
            }
        ]
    },
    "msg": "success",
    "date": "2021-10-05T17:38:36.153+00:00"
}

指定特定节点.比如我只想取以上用户管理的菜单,那么拿到用户管理的id传入即可.

http://localhost:8080/menu/biz/getMenu?pid=1445371079417503745

{
    "code": 200,
    "data": {
        "id": "1445371079417503745",
        "pid": null,
        "name": "用户管理",
        "path": "/user",
        "icon": "el-icon-user",
        "children": [
            {
                "id": "1445372598120456194",
                "pid": "1445371079417503745",
                "name": "用户信息",
                "path": "/user_info",
                "icon": "el-icon-s-custom",
                "children": null
            },
            {
                "id": "1445405355609530370",
                "pid": "1445371079417503745",
                "name": "用户列表",
                "path": "/users",
                "icon": "el-icon-s-custom",
                "children": null
            }
        ]
    },
    "msg": "success",
    "date": "2021-10-05T17:41:30.870+00:00"
}

数据库原始数据
在这里插入图片描述
前端展示(Vue)
在这里插入图片描述

3 结语

不知道怎么构建树形菜单的小伙伴可以看下这个工具类,希望可以给一部分朋友一点启示.有帮助的话,请点赞或评论,谢谢

4 补充

CollectUtil: 封装了一些常见的集合操作

package xyz.yq56.easytool.utils.collection;

import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import javax.annotation.Nullable;

import org.springframework.util.CollectionUtils;

import xyz.yq56.easytool.utils.nvll.NullUtil;

/**
 * @author yi qiang
 * @date 2021/9/19 22:54
 */
public class CollectUtil extends CollectionUtils {

    /**
     * <br> 示例用法: toMap(list, User::getId, User::getName, (v1, v2) -> v1 + "," + v2)
     * <br> [{"id":"1","name":"yq"},{"id":"1","name":"yw"}]
     * <br> toMap映射结果 ==> {1=yq,yw}
     *
     * @param list          待处理list
     * @param keyMapper     key映射规则,例如 User::getId
     * @param valueMapper   Value映射规则,例如 User::getName
     * @param mergeFunction merge规则,当出现key相同时,前后的value怎么取舍,例如: (v1,v2)-> v1+","+v2
     * @param <T>           list中的类型,比如User
     * @param <K>           key类型,比如String
     * @param <U>           value类型,比如String
     * @return map
     */
    public static <T, K, U> Map<K, U> toMap(List<T> list
            , Function<? super T, ? extends K> keyMapper
            , Function<? super T, ? extends U> valueMapper
            , BinaryOperator<U> mergeFunction) {
        if (NullUtil.isEmpty(list)) {
            return Collections.emptyMap();
        }
        return list.stream().collect(Collectors.toMap(keyMapper, valueMapper, mergeFunction));
    }


    /**
     * 映射为其他list
     *
     * @param list   原list
     * @param mapper 映射关系
     * @param <T>    原类型
     * @param <R>    映射类型
     * @return 映射集合
     */
    @Nullable
    public static <T, R> List<R> mapToOtherList(List<T> list, Function<? super T, ? extends R> mapper) {
        return NullUtil.apply(list, i -> i.stream().map(mapper).collect(Collectors.toList()));
    }

    /**
     * @param list      原list
     * @param predicate 过滤
     * @param <T>       原类型
     * @return 过滤后的list
     */
    @Nullable
    public static <T> List<T> filter(List<T> list, Predicate<? super T> predicate) {
        return NullUtil.apply(list, i -> i.stream().filter(predicate).collect(Collectors.toList()));
    }

    /**
     * 集合的大小
     * <br> 已判空
     *
     * @param collection 集合
     * @param <T>        泛型
     * @return 集合大小
     */
    public static <T> int size(Collection<T> collection) {
        if (CollectionUtils.isEmpty(collection)) {
            return 0;
        }
        return collection.size();
    }

    /**
     * 分组统计
     */
    public static <T, K> Map<K, Long> groupCount(List<T> list, Function<? super T, ? extends K> classifier) {
        if (CollectUtil.isEmpty(list) || classifier == null) {
            return Collections.emptyMap();
        }
        return list.stream().collect(Collectors.groupingBy(classifier, Collectors.counting()));
    }
}

NullUtil: 封装了一些与Null相关的操作

package xyz.yq56.easytool.utils.nvll;

import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.BiFunction;
import java.util.function.Function;

import org.apache.commons.lang3.ArrayUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

/**
 * 空值处理工具类
 *
 * @author yi qiang
 * @date 2021/9/17 0:32
 */
public class NullUtil {

    private NullUtil() {
    }

    /**
     * 如果字符串为空值或者null,那么返回空值
     *
     * @param str 字符串
     * @return 不会为null
     */
    public static String emptyIfNull(String str) {
        return StringUtils.isEmpty(str) ? "" : str;
    }

    /**
     * 如果集合为空值或者null,那么返回空集合
     *
     * @param list 集合
     * @return 不会为null
     */
    public static <T> List<T> emptyIfNull(List<T> list) {
        return CollectionUtils.isEmpty(list) ? Collections.emptyList() : list;
    }

    /**
     * 如果集合为空值或者null,那么返回空集合
     *
     * @param set 集合
     * @return 不会为null
     */
    public static <T> Set<T> emptyIfNull(Set<T> set) {
        return CollectionUtils.isEmpty(set) ? Collections.emptySet() : set;
    }

    /**
     * 如果集合为空值或者null,那么返回空集合
     *
     * @param map 集合
     * @return 不会为null
     */
    public static <K, V> Map<K, V> emptyIfNull(Map<K, V> map) {
        return CollectionUtils.isEmpty(map) ? Collections.emptyMap() : map;
    }

    /**
     * 执行function,t为null则返回null
     *
     * @param t        主体
     * @param function 函数
     * @param <T>      入参
     * @param <R>      结果
     * @return 执行结果
     */
    public static <T, R> R apply(T t, Function<T, R> function) {
        return t == null ? null : function.apply(t);
    }

    /**
     * t为null则返回null
     * u为null执行第一种情况,u不为null执行第二种情况
     *
     * @param t        主体
     * @param function 函数
     * @param <T>      入参
     * @param <R>      结果
     * @return 执行结果
     */
    public static <T, U, R> R apply(T t, U u, Function<T, R> function, BiFunction<T, U, R> biFunction) {
        if (t == null) {
            return null;
        }
        return u == null ? function.apply(t) : biFunction.apply(t, u);
    }

    /**
     * 返回当前对象是否为空
     *
     * @param obj 对象
     * @return 是否为空
     */
    public static boolean isNull(Object obj) {
        return obj == null;
    }

    /**
     * 只要有一个为null,那就返回true
     *
     * @param objs objs 待判断集合
     * @return 是否为null
     */
    public static boolean isAndNull(Object... objs) {
        //只要有一个为null,那就为true
        for (Object obj : objs) {
            if (obj == null) {
                return true;
            }
        }
        return false;
    }

    /**
     * 只要有一个不为null,那就返回false
     *
     * @param objs 待判断集合
     * @return 是否为null
     */
    public static boolean isOrNull(Object... objs) {
        for (Object obj : objs) {
            if (obj != null) {
                return false;
            }
        }
        return true;
    }

    /**
     * 返回当前集合类是否为空
     *
     * @param collection 集合类
     * @return 集合类
     */
    public static boolean isEmpty(Collection<?> collection) {
        return CollectionUtils.isEmpty(collection);
    }

    /**
     * 返回当前Map是否为空
     *
     * @param map map
     * @return 是否为空
     */
    public static boolean isEmpty(Map<?, ?> map) {
        return CollectionUtils.isEmpty(map);
    }

    /**
     * 返回当前数组是否为空
     *
     * @param array 数组
     * @return 是否为空
     */
    public static boolean isEmpty(Object[] array) {
        return ArrayUtils.isEmpty(array);
    }


    public static <E, U> Optional<U> map(E e, Function<? super E, ? extends U> mapper) {
        return Optional.ofNullable(e).map(mapper);
    }

    public static <E, U> U map(E e, Function<? super E, U> mapper, U defaultValue) {
        return map(e, mapper).orElse(defaultValue);
    }

    public static void main(String[] args) {
        System.out.println(NullUtil.map(null, item -> new Date(), 4));
    }

}
JAVA 实现 tree 树形结构集合封装工具类,通用,高自定义,一条SQL语句、两次循环搞定;不需要递归,不需要一级一级的循环查询,只需将数据查询出来。 自定义层级查询,自定义参数,还可以将id和parentId的Long类型换成String类型,这样可用自定义的编码来实现树形;要查询的数据示例(只留了部分区域层级作为演示)下面放有此数据的sql语句。 阅读详情

相关推荐

java构建树形菜单(多级菜单)

通过简短的文章,让读者快速掌握树形菜单的原理和制作

qq_52753445的博客 1万+

使用element ui的el-tree多层级树形结构

使用element ui的el-tree多层级树形结构

weixin_47097867的博客 948

JAVA 递归实现构造无限层级树形菜单

JAVA 递归实现构造无限层级树形菜单

qq_41683919的博客 1164

JAVA构建树形结构通用工具类

JAVA构建树形结构通用工具类场景说明构建思路实现第一步:构建接口TreeFeature第二步:让需要构建树形结构的类实现该接口并实现方法功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 场景说明 在日常java开发过程中,经常遇到

postivedragon的博客 5218

Lucene学习总结之二:Lucene的总体架构

Lucene总的来说是: 一个高效的,可扩展的,全文检索库。 全部用Java实现,无须配置。 仅支持纯文本文件的索引(Indexing)和搜索(Search)。 不负责由其他格式的文件抽取纯文本文件,或从网络中抓取文件的过程。 在Lucene in action中,Lucene 的构架和过程如下图, 说明Lucene是有索引和搜索的两个过程,包

forfuture1978的专栏 1万+

FAST-LIO 实战:从 LI-Init 标定到 YAML 配置全解析

本文详细解析了FAST-LIO算法中LI-Init标定的关键步骤与YAML配置优化技巧。从激光雷达与IMU的时空标定原理到实战参数调优,提供了一套完整的解决方案,帮助开发者解决点云畸变、建图漂移等常见问题,提升SLAM系统在动态环境中的稳定性和精度。

weixin_42651281的博客 330

java递归生成树形结构菜单

一、mysql表,数据自行准备 CREATE TABLE `sys_menu` ( `id` int(11) NOT NULL AUTO_INCREMENT, `pid` bigint(20) DEFAULT NULL, `title` varchar(255) CHARACTER SET utf8 DEFAULT NULL, `path` varchar(255) CHARA...

记录点滴 1万+

ADF4002分频器避坑指南:常见配置错误及解决方案

本文深入解析了ADF4002分频器在实战应用中的常见陷阱与解决方案。内容涵盖寄存器配置逻辑、硬件PCB布局要点、软件驱动时序细节及系统化调试方法,重点阐述了如何避免因配置错误导致芯片无法正常工作的问题,帮助工程师高效完成高精度频率合成系统设计。

weixin_29192141的博客 97

多级菜单树形结构构建

树形结构,常用于上下级分级或导航栏的菜单分级,它们都可以算作是树形结构。实现效果:我们知道通常来说会在设计数据库字段的时候,增设一个parentId用来指向父类(顶级菜单默认为null,同root->null一致),但在代码中如何实现呢?例如导航栏,它通常是在首页进行展示,它要求后端查询所有的节点并表现层级关系,获取所有节点的数据很好实现,只需要执行一次全表查询即可,重点在于如何实现表现层级关系呢?形象来说我们查询出来的所有节点数据,它是用列表来存储,但我们最终要的结果是要求以树形层次来返回。

m0_64132144的博客 1639

高数 | 【极限与等价无穷小】两个重要极限 & 经典错误 & 什么情况下求极限可以直接带入

一. 第一个重要极限 二. 第二个重要极限 三. 导数定义式 全文见【高等数学】两个重要的极限 - 知乎

"You are worthy! You can do it!" 6万+

Android音频学习(十四)——加载音频设备

loadHwModule 是 Android 音频系统的核心初始化函数,负责加载音频硬件抽象层(HAL)的模块实现。它建立 AudioPolicyService 与底层硬件的桥梁,将配置文件(audio_policy_config.xml)中的标签<module>定义转化为可操作的硬件对象,加载的是音频硬件模块(HAL实现),每个模块对应一种音频设备类型,以动态库的形式存在,负责与底层音频硬件交互。

miemie2014的博客 1732

非递归实现树形下拉菜单

在递归中,函数会自己调用自己。非递归实现是用队列(Queue)或栈(Stack)来替代函数调用栈,从而手动管理需要处理的数据,逐步完成任务。构造一个实体类Category// 分类的唯一标识// 分类的名称// 父分类的ID// 子分类列表// 构造方法// Getters 和 Setters 方法(省略)@Override'}';非递归方法通过手动管理队列解决了递归方法的栈深度问题,更适合大规模数据。希望本篇内容能够帮助您更清晰地理解树形结构构建。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 1万+

【嵌入式 – GD32开发实战指南(ARM版本)】第1部分 基础篇 - 第1章 开发环境搭建

开发环境: MDK:Keil 5.30 MCU:GD32F207IK 1.1 GD32F207I-EVAL开发板简介 笔者使用的开发板是兆易创新设计的GD32F207I-EVAL开发板。 GD32F207I-EVAL开发板使用 GD32F207IK作为主控制器,主频120MHz、集成3MB Flash、256KB SRAM、通用定时器*10、Adv. TM*2、Basic TM*2、系统时钟*1、看门狗*2、RTC*1、USART*4、UART*4、I2C*3、SPI*3、I2S*1、SDIO*1、CAN

不问归期的博客 9992

java 菜单递归_java构建树形菜单递归工具类

1.设计菜单实体importjava.util.List;public classMenu {//菜单idprivateLong id;//父节点idprivateLong parentId;//菜单名称privateString name;//对应路径privateString url;//图标privateString icon;//是否选中private booleanselected;pr...

weixin_42298622的博客 306

什么是 SAP S/4HANA 的 Brown Field 迁移和 Green Field 迁移

Brown Field实施涉及升级现有的 SAP 环境并继续使用一些遗留组件。它类似于传统升级,因为它涉及软件更新、一些数据转换和一些业务流程的调整。它仍然具有破坏性,但比Green Field实施要少得多。如果你是风险厌恶者,倾向于逐步使用 S/4HANA 的功能,或担心 S/4HANA Green Field方法的成本,那么你可能更喜欢这种方法。混合方法结合了Brown Field和Green Field迁移的一些元素。它从公司的 SAP 系统的副本开始,包括配置设置和定制。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1324

uniapp [安卓苹果App端] - 实现微信支付功能+拉起微信付款支付后返回本app页面,详解uniApp如何唤起本机微信app并跳转到支付页面全流程及示例源码(uniapp实现微信支付,可打包)

uni-app项目在APP端使用微信支付功能,uniapp前端实现微信支付,uniapp开发安卓App对接微信支付,uniapp苹果ios唤起微信支付,uniapp调用微信支付uniapp开发app-调用微信支付,uniapp开发安卓苹果app如何接入微信支付,前后端应该怎么做,UniApp中实现微信支付功能,支付报错,调起失败没响应,uniapp苹果微信支付唤起实现,app唤起微信支付,拉起微信支付,uniapp中唤醒微信进行支付并返回app,uniApp调起微信支付失败报错,全网最详细的uniapp微信

🏆 前端领域优质创作者 1万+

JAVA语言递归生成树形菜单

JAVA递归生成树形菜单 递归生成一个如图的菜单,编写两个类数据模型Menu、和创建树形的MenuTree。通过以下过程实现: 1.首先从菜单数据中获取所有根节点。 2.为根节点建立次级子树并拼接上。 3.递归为子节点建立次级子树并接上,直至为末端节点拼接上空的“树”。          首先,编写数据模型Menu。每条菜单有自己的id、父节点parentId、菜单名称text、菜单还拥有次级菜单children。 import java.util.List; public class Menu {

张同学的博客 974

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java8 流式递归树形菜单

Web端常用界面 => 树形菜单。

while(True): print('adorable') 2479

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

java菜单类_java构建树形菜单递归工具类

1.设计菜单实体importjava.util.List;public classMenu {//菜单idprivateLong id;//父节点idprivateLong parentId;//菜单名称privateString name;//对应路径privateString url;//图标privateString icon;//是否选中private booleanselected;pr...

weixin_42355665的博客 276

秒懂!递归构建树形菜单结构工具

1、有时候操作菜单功能的时候难免回遇见这一类问题: 有一个菜单,菜单里面还有子菜单,子菜单里面还有子菜单。。。。。等等,我们需要一次性将数据组装好发给前端工程师。 2、这个时候思路其实也很多的,有的人说用存储过程!我个人是不推荐的,毕竟使用存储过程是在数据库端,对应java代码的维护要做相应改变,所有我个人推荐使用Java代码层面递归构建这个树形结构! 3、在实现功能前我们可以看看数据库表中的数...

weixin_44598993的博客 940

Java递归构建树形数据结构实现多级树形菜单展示

首先看看需求,树形菜单是这样的:根据需求创建数据模型:构造树形数据结构:转为json数据看看结构是否正确:打完收工!

qq_33281710的博客 3万+

Java递归构建树形结构

​ 本文介绍Java后台构建树形结构数据的设计思路及实现,在设计过程中,仍然存在许多未能充分理解的位置,若存在错误或更好实现方案,可分享/指出,共同学习进步。

qq_43842093的博客 4647

Java递归生成树形菜单

  递归生成一个如图的菜单,编写两个类数据模型Menu、和创建树形的MenuTree。通过以下过程实现:     1.首先从菜单数据中获取所有根节点。     2.为根节点建立次级子树并拼接上。     3.递归为子节点建立次级子树并接上,直至为末端节点拼接上空的“树”。 首先,编写数据模型Menu。每条菜单有自己的id、父节点parentId、菜单名称text、菜单还拥有次级菜单chil...

cocosun 804

Java构建树形菜单(包括多级菜单)的实例代码

简单几步,JAVA快速实现封装多级树结构对象

Lee_X优快云的博客 52万+

Java 递归实现树形菜单

1、实现效果:2、实现思路:递归生成思路,编写两个类: 数据模型Menu、和 创建树形的MenuTree。通过以下过程实现:1.首先从菜单数据中获取所有根节点。 2.为根节点建立次级子树并拼接上。 3.递归为子节点建立次级子树并接上,直至为末端节点拼接上空的“树”。3、实现代码1、首先,编写数据模型Menu。每条菜单有自己的menuId、父节点parentId、菜单名称menuDescribe、菜单还拥有次级菜单children。 2、创建树形结构的类MenuTree。方法getRootNode获取所有根节

怎么老是你的博客 2260

JAVA 递归实现树形

因此,这段代码就是通过传递一个主键id和一个PermissionDirectoryResVO集合对象参数,然后遍历循环PermissionDirectoryResVO对象集合,把每一个对象的父目录id和传递过来的参数id进行对比,如果父目录id等于参数id就把这个对象收集到新的集合中,最后作为参数返回。因此,这段代码的作用是将原始列表menuList中的每个元素转换为AuthMenuResVO类型的对象,并将转换后的对象存储在一个新的列表permissionDirectoryResVO中。

weixin_46867489的博客 1706
上一篇: 关于Springboot中跨域问题的解决(Response to preflight request doesn‘t pass access control check)
下一篇: git新手教程,本地新增项目并上传至码云指定仓库
一步一结
博客等级 码龄7年 50粉丝 65原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值