2016-11-06 7 views
1

一般的なN配列ツリー実装であるJava 8のラムダ式を学習するためのケーススタディを行いました。再帰関数を使用して、私はこの時点で打たれました。ツリー実装のラムダ式への再帰関数呼び出し変換java

public class GenericTree<T> { 

private GenericTreeNode<T> root; 

public GenericTree() { 
    super(); 
} 

public GenericTreeNode<T> getRoot() { 
    return this.root; 
} 

public void setRoot(GenericTreeNode<T> root) { 
    this.root = root; 
} 

public int getNumberOfNodes() { 
    int numberOfNodes = 0; 

    if(root != null) { 
     numberOfNodes = getNumberOfnodeRecursiveFunc(root) + 1; //1 for the root! 
    }   

    return numberOfNodes; 
} 

private int getNumberOfnodeRecursiveFunc(GenericTreeNode<T> node) { 
    Integer numberOfNodes = node.getNumberOfChildren(); 

    for(GenericTreeNode<T> child : node.getChildren()) { 
     numberOfNodes += getNumberOfnodeRecursiveFunc(child); 
    }   

    //node.getChildren().stream().map(child ->this.getNumberOfnodeRecursiveFunc(child)); 

    //return node.getNumberOfChildren() + node.getChildren().stream().collect(Collectors.summingInt(GenericTree::getNumberOfnodeRecursiveFunc));   
}} 

コードスニペットで説明した従来のアプローチを使用する代わりに、ラムダ式を再帰的に使用してノード数を取得する方法はありますか。

注:私は、彼らが簡単な階乗expression.Soを提供あなたの質問を想定すると、この

+0

あなたは打たれ?何によって?あなたはそこに質問があると思うように見えますが、私はそれを見ません。 –

+0

申し訳ありません...私の表現がプロンプトではない場合...問題は、コードスニペットで説明した従来のアプローチを使用する代わりに、ラムダ式を再帰的に使用してノードの数を取得する方法です。 – karthik

答えて

1

にいくつかのより深い洞察を提供してください、複数の他の質問を通り抜けたが、ラムダへgetNumberOfnodeRecursiveFuncを「翻訳」する方法である(コードが正しいと思われるので、私)それはあなたが求めているものだと思う、可能な解決策は次のようになります。

private int getNumberOfnodeRecursiveFunc(GenericTreeNode<T> node) { 
     return node.getNumberOfChildren() + node.getChildren().stream().collect(Collectors.summingInt(Test::getNumberOfnodeRecursiveFunc)); 
    } 

あなたはメソッドの参照作業を行うために、クラスの適切な名前にTestを変更する必要があると思います。

collectを使用して、削減を行い、ツリー内のノード数を取得します。

私はそれで十分だろうと思います。

UPDATE

コンパイラエラーを解決するには、次の2つのアプローチ試すことができます作る

  • getNumberOfnodeRecursiveFunc静的(私は推測するオプションではありません)
  • 代替方法参照がラムダによって。

    private int getNumberOfnodeRecursiveFunc(MyNode node) { 
        return node.getNumberOfChildren() + node.getChildren().stream().collect(Collectors.summingInt(n - > getNumberOfnodeRecursiveFunc(n))); 
    } 
    
+0

お返事ありがとうございます。しかし、エラーは、静的メソッドgetNumberOfnodeRecursiveFunc(GenericTreeNode)をGenericTreeタイプから静的に参照することはできません。 – karthik

+1

@karthikようこそ。私は可能な解決策で答えを更新しました。それはあなたのために働くことを願っています – acontell

+0

編集がうまくいきました。おはよう – karthik

関連する問題