关于java:Java-递归实例操作查询层级菜单

递归

程序调用本身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或阐明中有间接或间接调用本身的一种办法,它通常把一个大型简单的问题层层转化为一个与原问题类似的规模较小的问题来求解,递归策略只需大量的程序就可形容出解题过程所须要的多次重复计算,大大地缩小了程序的代码量。递归的能力在于用无限的语句来定义对象的有限汇合。一般来说,递归须要有边界条件、递归后退段和递归返回段。当边界条件不满足时,递归后退;当边界条件满足时,递归返回。

递归的使用

零碎中总会有菜单和权限的操作,会呈现有限层级的操作,就须要用到递归。使用其调用本身的个性,实现有限层级迭代,通过父子节点展现数据。

递归的实例操作

以查问所有菜单为例

数据结构

字段 名称
id ID
fatherId 父ID
name 名称
…… ……

数据实体

/*
 * File:Menus.java
 * User:iChochy
 * URL:https://ichochy.com
 * Copyright (c) 2021
 * Date:2021/03/16 14:12:16
 */

package com.ichochy.entity;

import java.util.List;

public class Menu {
    private int id;
    private int fatherId;
    private String name;
    private List<Menu> childs;
    //…………

}

数据查问

通过 fatherId 查问子菜单信息


    /**
     * 查问菜单信息-模仿办法
     * @param fatherId
     * @return
     */
    public  List<Menu> getMenuByFatherId(int fatherId) {
        int value = new Random().nextInt(fatherId);
        if (value % 2 != 0) {
            List<Menu> menus = new ArrayList<>(value);
            for (int i = 1; i <= value; i++) {
                Menu menu = new Menu();
                menu.setId(i);
                menu.setFatherId(fatherId);
                menu.setName(”menu-“ + fatherId+”-“+i);
                menus.add(menu);
            }
            return menus;
        }
        return Collections.EMPTY_LIST;
    }

没有建表查库,写个模仿办法

递归办法

/*
 * File:Recursion.java
 * User:iChochy
 * URL:https://ichochy.com
 * Copyright (c) 2021
 * Date:2021/03/16 14:07:16
 */

package com.ichochy.recursion;

import com.ichochy.entity.Menu;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class Recursion {

    /**
     * 获取菜单
     * @param fatherId
     * @return
     */
    public  List<Menu> getAllMenus(int fatherId) {
        List<Menu> menus = getMenuByFatherId(fatherId);
        for (Menu menu : menus) {
            fatherId = menu.getId();
            //本人调用本人
            List<Menu> childMenus = getAllMenus(fatherId);
            //跳出递归
            if (childMenus.isEmpty()) {
                continue;
            }
            menu.setChilds(childMenus);
        }
        return menus;
    }

形成递归需具备的条件:

  1. 子类问题与父类问题雷同
  2. 不能无限度地调用本身,须有跳出进口,边界返回

递归数据

[
  {
    ”id“: 1,
    ”fatherId“: 15,
    ”name“: ”menu-15-1“
  },
  {
    ”id“: 2,
    ”fatherId“: 15,
    ”name“: ”menu-15-2“,
    ”childs“: [
      {
        ”id“: 1,
        ”fatherId“: 2,
        ”name“: ”menu-2-1“
      }
    ]
  },
  {
    ”id“: 3,
    ”fatherId“: 15,
    ”name“: ”menu-15-3“,
    ”childs“: [
      {
        ”id“: 1,
        ”fatherId“: 3,
        ”name“: ”menu-3-1“
      }
    ]
  },
  {
    ”id“: 4,
    ”fatherId“: 15,
    ”name“: ”menu-15-4“,
    ”childs“: [
      {
        ”id“: 1,
        ”fatherId“: 4,
        ”name“: ”menu-4-1“
      },
      {
        ”id“: 2,
        ”fatherId“: 4,
        ”name“: ”menu-4-2“,
        ”childs“: [
          {
            ”id“: 1,
            ”fatherId“: 2,
            ”name“: ”menu-2-1“
          }
        ]
      },
      {
        ”id“: 3,
        ”fatherId“: 4,
        ”name“: ”menu-4-3“,
        ”childs“: [
          {
            ”id“: 1,
            ”fatherId“: 3,
            ”name“: ”menu-3-1“
          }
        ]
      }
    ]
  }
]

相干文章

  • Java JSON数据实战操作 2020/10/10

  • Java 正则表达式实例操作 2020/08/28

  • Java 办法代理实例操作,动态代理、JDK动静代理、CGLIB动静代理 2020/08/24

  • Java 反射实例操作 2020/08/23

  • Java 中的重写(Override)与重载(Overload) 2020/08/20

源文:https://ichochy.com/posts/20210315.html

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理