java - 查找列表中元素的所有父项
问题描述
查找列表中元素的所有父项
public class MyNode {
private String name;
private List<MyNode> nodeList;
}
List<MyNode> root = new ArrayList<>();
MyNode a = new MyNode("a");
List<MyNode> aList = new ArrayList<>();
aList.add(new MyNode("a1"));
aList.add(new MyNode("a2"));
a.setNodeList(aList);
MyNode b = new MyNode("b");
List<MyNode> bList = new ArrayList<>();
bList.add(new MyNode("b1"));
bList.add(new MyNode("b2"));
b.setNodeList(bList);
root.add(a);
root.add(b);
例子:
输入 b1 返回 List 其中包含 b1 节点和 b 节点
如何用java实现?谢谢
解决方案
我创建了这个程序,它使用递归并打印从父节点到要找到的节点的层次结构。
import java.util.ArrayList;
import java.util.List;
public class MyNode {
private String name;
private List<MyNode> nodeList;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<MyNode> getNodeList() {
return nodeList;
}
public void setNodeList(List<MyNode> nodeList) {
this.nodeList = nodeList;
}
public MyNode(String name) {
super();
this.name = name;
}
public static void main(String f[]) {
List<MyNode> root = new ArrayList<>();
MyNode a = new MyNode("a");
List<MyNode> aList = new ArrayList<>();
aList.add(new MyNode("a1"));
aList.add(new MyNode("a2"));
a.setNodeList(aList);
MyNode b = new MyNode("b");
List<MyNode> bList = new ArrayList<>();
MyNode nodeb1 = new MyNode("b1");
MyNode nodeb11 = new MyNode("b11");
MyNode nodeb12 = new MyNode("b12");
List<MyNode> b1List = new ArrayList<>();
b1List.add(nodeb11);
b1List.add(nodeb12);
nodeb1.setNodeList(b1List);
bList.add(nodeb1);
bList.add(new MyNode("b2"));
b.setNodeList(bList);
root.add(a);
root.add(b);
List<MyNode> list = new ArrayList<>();
for (MyNode node : root) {
findAll(list, node, "b12");
if (list.size() != 0)
break;
}
list.stream().forEach(s -> System.out.println(s.getName()));
}
public static List<MyNode> findAll(List<MyNode> list, MyNode node, String nodeName) {
if (node.getName().equals(nodeName)) {
list.add(node);
return list;
} else if (node.getNodeList() != null) {
for (MyNode myNode : node.getNodeList()) {
List<MyNode> temp = new ArrayList<>();
findAll(temp, myNode, nodeName);
if (temp.size() != 0) {
list.add(node);
list.addAll(temp);
break;
}
}
return list;
} else
return null;
}
}
推荐阅读
- vue.js - Nuxt:中间件中的 i18n.localePath 访问
- r - 当一个数据框调用 with 时,我们如何不使用它的名字来引用父数据框呢?
- angular - 如何将 2 个 observables 的结果组合为对象的属性?
- javascript - 在Javascript中的连字符之前获取字符串中的所有内容
- c - fread 和 fwrite 将浮点矩阵从 .dat 文件保存到内存中的数组的问题
- php - PHP中的一个函数中的多个连续输出而不是一个
- javascript - Javascript 的 setAttribute() 没有用值恢复到原始状态
- python - 熊猫:返回列值的最后一个元素
- svg - 如何访问包含在 Plasma 5 中的新 Plasmoid 中的 SVG?
- c# - 使用没有接口的模拟进行 C# 单元测试