博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java递归
阅读量:7110 次
发布时间:2019-06-28

本文共 5792 字,大约阅读时间需要 19 分钟。

1 package com.sun.test;  2   3 import java.util.ArrayList;  4 import java.util.List;  5   6   7 /**  8  * 递归  9  * 10  */ 11 public class Recursion { 12  13     private String id; 14     private String name; 15     private Recursion parent;// 父单元格对象 16     private List
children = new ArrayList
();// 子单元格集合 17 18 public Recursion() { 19 } 20 21 public Recursion(String id) { 22 this.id = id; 23 } 24 25 /** 26 * 获得所有节点的id 27 * @param r 28 * @param rs 29 */ 30 public static void getIds(Recursion r , List
rs) { 31 if (r.getChildren() != null && r.getChildren().size() > 0) { 32 rs.add(r.getId()); 33 for (Recursion recursion : r.getChildren()) { 34 getIds(recursion, rs); 35 } 36 } else { 37 rs.add(r.getId()); 38 } 39 } 40 41 public static List
getIds(Recursion r) { 42 List
rs = new ArrayList<>(); 43 if (r.getChildren() != null && r.getChildren().size() > 0) { 44 rs.add(r.getId()); 45 for (Recursion recursion : r.getChildren()) { 46 rs.addAll(getIds(recursion)); 47 } 48 } else { 49 rs.add(r.getId()); 50 } 51 return rs; 52 } 53 54 /** 55 * 某个对象的子的最大宽度,也就是某个对象他最后一级的孩子节点的个数 56 * @return 57 */ 58 public int getRowNum() { 59 int rowNum = children.size(); 60 for (Recursion hc : children) { 61 if (hc.getRowNum() > 0) { 62 rowNum += hc.getRowNum() - 1; 63 } 64 } 65 return rowNum; 66 } 67 68 public static void main(String[] args) { 69 Recursion r = new Recursion("r"); 70 Recursion r1 = new Recursion("r1"); 71 Recursion r2 = new Recursion("r2"); 72 Recursion r1_1 = new Recursion("r1_1"); 73 Recursion r1_2 = new Recursion("r1_2"); 74 Recursion r1_3 = new Recursion("r1_3"); 75 Recursion r2_1 = new Recursion("r2_1"); 76 Recursion r2_2 = new Recursion("r2_2"); 77 Recursion r1_1_1 = new Recursion("r1_1_1"); 78 Recursion r1_1_2 = new Recursion("r1_1_2"); 79 Recursion r2_1_1 = new Recursion("r2_1_1"); 80 Recursion r2_1_2 = new Recursion("r2_1_2"); 81 Recursion r2_1_3 = new Recursion("r2_1_3"); 82 r.getChildren().add(r1); 83 r.getChildren().add(r2); 84 r1.getChildren().add(r1_1); 85 r1.getChildren().add(r1_2); 86 r1.getChildren().add(r1_3); 87 r1_1.getChildren().add(r1_1_1); 88 r1_1.getChildren().add(r1_1_2); 89 r2.getChildren().add(r2_1); 90 r2.getChildren().add(r2_2); 91 r2_1.getChildren().add(r2_1_1); 92 r2_1.getChildren().add(r2_1_2); 93 r2_1.getChildren().add(r2_1_3); 94 95 List
rs = new ArrayList<>(); 96 getIds(r, rs); 97 for (String string : rs) { 98 System.out.println(string); 99 }100 System.out.println("--------------------------");101 List
rs1 = getIds(r);102 for (String string : rs1) {103 System.out.println(string);104 }105 System.out.println("--------------------------");106 System.out.println(r.getRowNum());107 }108 109 public String getId() {110 return id;111 }112 113 public void setId(String id) {114 this.id = id;115 }116 117 public String getName() {118 return name;119 }120 121 public void setName(String name) {122 this.name = name;123 }124 125 public Recursion getParent() {126 return parent;127 }128 129 public void setParent(Recursion parent) {130 this.parent = parent;131 }132 133 public List
getChildren() {134 return children;135 }136 137 public void setChildren(List
children) {138 this.children = children;139 }140 141 }

 

测试类结果为

1 r 2 r1 3 r1_1 4 r1_1_1 5 r1_1_2 6 r1_2 7 r1_3 8 r2 9 r2_110 r2_1_111 r2_1_212 r2_1_313 r2_214 --------------------------15 r16 r117 r1_118 r1_1_119 r1_1_220 r1_221 r1_322 r223 r2_124 r2_1_125 r2_1_226 r2_1_327 r2_228 --------------------------29 8
View Code

这里我会画出递归的流程,这样递归就显而易见了

 

前面是对实体的应用一般用在拥有主子关系的系统的。还有一种应用可能比较多见,那就是递归json,有个案例可以看一下,就是一个jsonArray字符串,我需要隐藏其中的某些节点,这里json的格式为含有chil

1     /** 2      * var nodes = [ 3      *    {id: "node1", 4      *    children: [ 5      *        {id: "node1_1"}, 6      *        {id: "node1_2"} 7      *    ]} 8      *]; 9      * 递归JSONArray 移除不需要的id,如果子节点都被移除了,那么其父节点也要被移除,以此类推10      * 这里默认过滤最底层节点,如果要过滤所有,只需要稍加改造11      * @param arr json数组12      * @param 拥有的id13      * @return14      */15     @SuppressWarnings("unchecked")16     public static int iterationMenu(JSONArray arr, List
ids) {17 int f = 0;18 for (Iterator
iterator = arr.iterator(); iterator.hasNext();) {19 JSONObject level1Obj = (JSONObject) iterator.next();20 if (level1Obj.containsKey("children")) {21 int j = iterationMenu(level1Obj.getJSONArray("children"), ids);22 if (level1Obj.containsKey("id") && ids.contains(level1Obj.getString("id"))) {23 j++;24 }25 if (j == 0) {26 iterator.remove();27 } else {28 f++;29 }30 } else {31 if (level1Obj.containsKey("id")) {32 if (!ids.contains(level1Obj.getString("id"))) {33 iterator.remove();34 } else {35 f++;36 }37 }38 }39 }40 return f;41 }

只要了解了递归的执行顺序,那么上面的代码很容易理解!

 

转载于:https://www.cnblogs.com/sun-space/p/5585385.html

你可能感兴趣的文章
看得见的数据结构Android版之二分搜索树篇
查看>>
实现Treeset
查看>>
Android Jetpack 助推应用开发 | 中文字幕视频介绍
查看>>
Es2016、2017新特性(上)
查看>>
聊天系统很复杂?前端工程师也能完成!
查看>>
一步一步学习JNI
查看>>
【译】 WebSocket 协议第九章——扩展(Extension)
查看>>
如何架构一个数据工程
查看>>
CSS入门指南-4:页面布局
查看>>
Kotlin——高级篇(四):集合(Array、List、Set、Map)基础
查看>>
Java并发编程之锁机制之LockSupport工具
查看>>
浅析Vue源码(四)—— $mount中template的编译--parse
查看>>
In FontFamilyFont, unable to find attribute android:font的报错处理
查看>>
基于 Scala 的产品开发实践 | 掘金技术征文
查看>>
【面经】寒冬中的一年半前端跳槽
查看>>
2018,来年只剩追忆
查看>>
React Native图片选择裁剪组件
查看>>
[翻译] 理解 CSS 布局和块级格式上下文
查看>>
Android小知识-定时任务ScheduledThreadPoolExecutor
查看>>
Python基础算法库及可视化库使用实践-大数据ML样本集案例实战
查看>>