首页 > 解决方案 > 查找列表中元素的所有父项

问题描述

查找列表中元素的所有父项

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实现?谢谢

标签: javalistalgorithmrecursionsearch

解决方案


我创建了这个程序,它使用递归并打印从父节点到要找到的节点的层次结构。

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;

 }

}

推荐阅读