java中的自定义树节点搜索算法

时间:2018-02-14 09:08:51

标签: java java-stream

我正在尝试根据搜索查询搜索子节点。我还需要让他们的父母留在名单中。我正面临着迭代和过滤已经填充了父母和孩子的完整树的困难。 搜索查询将与以下类的nodeName属性匹配。

这是我的TreeNode类

public class TreeNodeDTO {

/** The id. */
private String id;

/** The nodeName. */
private String nodeName;

/** The children. */
private List<TreeNodeDTO> children;

//setters and getters
}

1 个答案:

答案 0 :(得分:2)

您可以创建一个辅助方法,返回此节点的Stream<TreeNodeDTO>及其后代(递归搜索),然后在流上搜索:

private Stream<TreeNodeDTO> descendants() {
    return Stream.concat(
        Stream.of(this),
        children.stream().flatMap(TreeNodeDTO::descendants));
}

用法:

Optional<TreeNodeDTO> maybeNode = rootNode.descendants()
    .filter(n -> n.nodeName.equals("something"))
    .findFirst();

maybeNode.ifPresent(n -> /* do something with the found node */);

编辑1:

如果要检索满足搜索条件的许多节点,可以这样做:

List<TreeNodeDTO> results = rootNode.descendants()
    .filter(n -> n.nodeName.equals("something"))
    .collect(Collectors.toList());

编辑2:

要查找满足搜索条件的节点的父节点,请考虑在getParent()类中添加返回父节点的TreeNodeDTO方法。然后你可以按如下方式使用它:

List<TreeNodeDTO> parents = rootNode.descendants()
    .filter(n -> n.nodeName.equals("something"))
    .map(TreeNodeDTO::getParent)
    .collect(Collectors.toList());