2013-06-26 36 views
2

假設我有一個樹類和節點類樹遍歷和一階功能

public class Tree{ 
    private Node root; 
    public Tree(Node root){ this.root = root; } 
} 

public class Node{ 
    private ArrayList<Node> children; 
    private Node parent; 
    private String label; 
    private String someInfo; 
    private int someIntegerInfo; 
    private MyObject someObject; // Where MyObject is from some other class 
    ... 

    public Node(Node parent, ArrayList<Node> children, String label, String foo, ...){ 
     this.parent = parent; 
     this.children = children; 
     this.someInfo = foo; 
     ... 
    } 
} 

現在假設我需要做的,比方說,這些樹對象按順序深度優先遍歷提取信息。也許我希望這樣做一次,因爲它們被訪問時建立所有節點標籤的字符串,並且另一次我想要在int字段上執行一些操作等。

當我寫這些遍歷時,我當然要注意我正在編寫相同的代碼來遍歷遍歷,但在節點上執行不同的操作或返回不同的類型。

public something traverse(Node node, something foo){ 
    // Do some stuff with foo here 
    ... 
    for(Node child: node.getChildren()){ 
     return child.traverse(); 
    } 
    return foo; 
} 

有沒有辦法Java中有一個功能,不僅會遍歷,但隨後需要一個高階函數爲處理收集的任何信息排序我試圖得到一個說法?還是有更好的方法來做到這一點,我沒有想到?

+0

這是一個很好的場景,關閉是有幫助的。 Java還沒有提供關閉支持。所以吉里的回答很好。 – Faraway

回答

2

您可以封裝操作成一個Java類:

public interface NodeOperation { 
    void perform(Node node); 
} 

public void traverse(Node node, NodeOperation op) { 
    op.perform(node); 
    for(Node child: node.getChildren()) { 
     traverse(child, op); 
    } 
} 

//then for performing the operation during the traversal call following code 
traverse(node, new NodeOperation() { 
    perform(Node node) { 
     // do whatever you want 
     node.setSomeIntegerInfo(node.getSomeIntegerInfo() * 42); 
    } 
}); 

在Java 8有更好的方法來做到這一點使用的瓶蓋。