一、想要实现的效果
- 以搜索“秦朗为例”,最后返回的是 三国-曹操-秦朗 的一条链路(一棵树)。
二、我的代码
public class People {
private List<People> children;
private String name;
// 省略getter、setter方法
}
public static void main(String[] args) {
People sunce = new People();
sunce.setName("孙策");
People sunquan = new People();
sunquan.setName("孙权");
People sunjian = new People();
sunjian.setName("孙坚");
sunjian.setChildren(Arrays.asList(sunce, sunquan));
People caopi = new People();
caopi.setName("曹丕");
People caozhi = new People();
caozhi.setName("曹植");
People caozhang = new People();
caozhang.setName("曹彰");
People qinlang = new People();
qinlang.setName("秦朗");
People caocao = new People();
caocao.setName("曹操");
caocao.setChildren(Arrays.asList(caopi, caozhi, caozhang, qinlang));
People liufeng = new People();
liufeng.setName("刘封");
People liushan = new People();
liushan.setName("刘禅");
People liubei = new People();
liubei.setName("刘备");
liubei.setChildren(Arrays.asList(liufeng, liushan));
People liuxun = new People();
liuxun.setName("刘循");
People liuzhang = new People();
liuzhang.setName("刘璋");
liuzhang.setChildren(Arrays.asList(liuxun));
People liuyan = new People();
liuyan.setName("刘焉");
liuyan.setChildren(Arrays.asList(liuzhang));
People sanguo = new People();
sanguo.setName("三国");
sanguo.setChildren(Arrays.asList(sunjian, caocao, liubei, liuyan));
List<People> p1 = query(sanguo, "刘");
System.out.println(p1);
List<People> p2 = query(sanguo, "秦");
System.out.println(p2);
List<People> p3 = query(sanguo, "孙策");
System.out.println(p3);
}
public static List<People> query(People people, String name) {
List<People> result = new ArrayList<>();
// 这里要判空,但简写就省略了
if(people.getName().contains(name)) {
return Arrays.asList(people);
} else {
if(people.getChildren() != null) {
for (People p : people.getChildren()) {
result.addAll(query(p, name));
}
}
}
return result;
}
三、代码执行结果
四、解释
我递归用的少,用起来有点不达意。上面自己写的递归方法虽然能实现递归效果,但问题很大。
4.1、我的方法返回的只是命中项,而不是一个树的结构(除非第一层就命中了)。
4.2、返回的树里没有剔除未命中项。
上述两点(4.1和4.2)能否同时做到?如果不能,请指教怎么实现4.1,感谢。