1.menu實體類
package recursion;/** * Created by tl on 2016/4/10. */public class Menu { private String id; private String name; private String pid; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPid() { return pid; } public void setPid(String pid) { this.pid = pid; }}
2.測試類別
package recursion;import java.util.ArrayList;import java.util.List;/** * Created by tl on 2016/4/10. */public class MenuRecursion { //子節點 static List<Menu> childMenu=new ArrayList<Menu>(); /** * 擷取某個父節點下面的所有子節點 * @param menuList * @param pid * @return */ public static List<Menu> treeMenuList( List<Menu> menuList, int pid){ for(Menu mu: menuList){ //遍曆出父id等於參數的id,add進子節點集合 if(Integer.valueOf(mu.getPid())==pid){ //遞迴遍曆下一級 treeMenuList(menuList,Integer.valueOf(mu.getId())); childMenu.add(mu); } } return childMenu; } public static void main(String args[]) { List<Menu> menuList=new ArrayList<Menu>(); Menu mu=new Menu(); mu.setId("1"); mu.setName("目錄"); mu.setPid("0"); Menu mu1=new Menu(); mu1.setId("2"); mu1.setName("目錄1"); mu1.setPid("1"); Menu mu2=new Menu(); mu2.setId("3"); mu2.setName("目錄1.1"); mu2.setPid("2"); Menu mu3=new Menu(); mu3.setId("4"); mu3.setName("目錄1.2"); mu3.setPid("2"); Menu mu4=new Menu(); mu4.setId("5"); mu4.setName("目錄2"); mu4.setPid("1"); Menu mu5=new Menu(); mu5.setId("6"); mu5.setName("目錄2.1"); mu5.setPid("5"); Menu mu6=new Menu(); mu6.setId("7"); mu6.setName("目錄2.2"); mu6.setPid("5"); Menu mu7=new Menu(); mu7.setId("8"); mu7.setName("目錄2.2.1"); mu7.setPid("7"); menuList.add(mu); menuList.add(mu1); menuList.add(mu2); menuList.add(mu3); menuList.add(mu4); menuList.add(mu5); menuList.add(mu6); menuList.add(mu7); List<Menu> childList=treeMenuList(menuList,0); for(Menu m:childList){ System.out.println(m.getId() + " " + m.getName()); } } }
3.控制台結果:
3 目錄1.14 目錄1.22 目錄16 目錄2.18 目錄2.2.17 目錄2.25 目錄21 目錄
附錄:
遞迴在項目的使用代碼:
1.部門Department:
public class Department{/** * id */ private Integer departmentId; /** * 單位名稱 */ private String name; /** * 父級單位id,頂級單位為1 */ private Integer parentId;(省略get,set方法)}
2.遞迴代碼(查詢某個部門下面的所有子部門):
/** * 遞迴擷取某個部門id下面的所有子單位 */ private void findChildDepartments(Set<Department> departHashSet, Integer departmentId) { Department dep=departmentRepository.findByDepartmentId(departmentId); List<Department> deptments = new ArrayList<Department>(); deptments.add(dep); /** * 加入當前單位 */ departHashSet.addAll(deptments.stream().collect(Collectors.toList())); /** * 擷取子單位 */ List<Department> departments = departmentRepository.findByParentId(departmentId); for (Department d : departments) { /** * 遞迴子單位 */ findChildDepartments(departHashSet, d.getDepartmentId()); } }
上文講了遞迴演算法的概念,以及在數學演算法中的運用的相關代碼:
點擊開啟連結