2014-10-02 46 views
4

我想将树转换中的节点如何树结构转换中的节点的流在Java中

这里的Java8流是存储数据至极节点树可以选择

public class SelectTree<D> { 

    private D data; 

    private boolean selected = false; 

    private SelectTree<D> parent; 

    private final List<SelectTree<D>> children = new ArrayList<>(); 

    public SelectTree(D data, SelectTree<D> parent) { 
    this.data = data; 
    if (parent != null) { 
     this.parent = parent; 
     this.parent.getChildren().add(this) ; 
    } 
    } 

    public D getData() { 
    return data; 
    } 

    public void setData(D data) { 
    this.data = data; 
    } 

    public boolean isSelected() { 
    return selected; 
    } 

    public void setSelected(boolean selected) { 
    this.selected = selected; 
    } 

    public SelectTree<D> getParent() { 
    return parent; 
    } 

    public void setParent(SelectTree<D> parent) { 
    this.parent = parent; 
    } 

    public List<SelectTree<D>> getChildren() { 
    return children; 
    } 

    public boolean isRoot() { 
    return this.getParent() == null; 
    } 

    public boolean isLeaf() { 
    return this.getChildren() == null || this.getChildren().isEmpty(); 
    } 
} 

我想选择的数据 集合我想要做这样的事情:

public static void main(String[] args) { 
    SelectTree<Integer> root = generateTree() ; 

    List<Integer> selectedData = root.stream() 
      .peek(node -> System.out.println(node.getData()+": "+node.isSelected())) 
      .filter(node-> node.isSelected()) 
      .map(node-> node.getData()) 
      .collect(Collectors.toList()) ; 

    System.out.println("\nselectedData="+selectedData); 
    } 

    private static SelectTree<Integer> generateTree() { 
    SelectTree<Integer> n1 = new SelectTree(1,null) ; 
    SelectTree<Integer> n11 = new SelectTree(11,n1) ; 
    SelectTree<Integer> n12 = new SelectTree(12,n1) ; 
    n12.setSelected(true); 
    SelectTree<Integer> n111 = new SelectTree(111,n11) ; 
    n111.setSelected(true) ; 
    SelectTree<Integer> n112 = new SelectTree(112,n11) ; 
    SelectTree<Integer> n121 = new SelectTree(121,n12) ; 
    SelectTree<Integer> n122 = new SelectTree(122,n12) ; 
    return n1 ; 
    } 

问题是要找到流的实现(),我想我可以帮助一些人们分享我的解决办法,我会刘晓丹知道,如果有一些问题或者更好的方式来这样做

起初它是为primefaces树节点,但我概括这个问题所有种树


编辑我删除了树的抽象类无用此puporse以简化代码

+0

可能的重复[在Java中,我如何高效优雅地流式传输树节点的后代?](http://stackoverflow.com/questions/32749148/in-java-how-do-i-efficiently-and-优雅流-A-树节点后裔) – 2017-05-22 08:48:53

回答

5

我觉得这是实现流的()至极是一个DFS树遍历:

public class SelectTree<D> { 

    //... 

    public Stream<SelectTree<D>> stream() { 
    if (this.isLeaf()) { 
     return Stream.of(this); 
    } else { 
     return this.getChildren().stream() 
       .map(child -> child.stream()) 
       .reduce(Stream.of(this), (s1, s2) -> Stream.concat(s1, s2)); 
    } 
    } 
} 

如果你不能改变树实现像primefaces树节点(org.primefaces.model.TreeNode),您可以在其他类中定义的方法:

public Stream<TreeNode> stream(TreeNode parentNode) { 
    if(parentNode.isLeaf()) { 
     return Stream.of(parentNode) ; 
    } else { 
     return parentNode.getChildren().stream() 
       .map(childNode -> stream(childNode)) 
       .reduce(Stream.of(parentNode), (s1, s2) -> Stream.concat(s1, s2)) ; 
    } 
    } 
5

一个小小的除了kwisatz的答案。

此实现:

​​

会更加渴望,我。即整个层次结构将在流创建过程中遍历。如果您hirarchy是大,比方说,你正在寻找匹配某些谓词一个节点,你可能需要一个比较懒惰的行为:

Stream.concat(Stream.of(this), 
       this.getChildren().stream().flatMap(SelectTree::stream)); 

在这种情况下,只有根节点的孩子会在流创建期间检索,并且搜索节点不一定会导致整个层次被遍历。

两种方法都会显示DFS迭代顺序。

相关问题