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 Listchildren = 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 }
测试类结果为
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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
这里我会画出递归的流程,这样递归就显而易见了
前面是对实体的应用一般用在拥有主子关系的系统的。还有一种应用可能比较多见,那就是递归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, Listids) {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 }
只要了解了递归的执行顺序,那么上面的代码很容易理解!