f#で文字列リストの指定されたパスからツリーを作成する

geegog

私はタイプの定義を持っています:

type FsTree = Node of (string * FsTree) list

空のノードを作成します。

let createEmptyFsTree () : FsTree = Node[]

文字列リストのパスからツリーを構築したいと思います。次に例を示します。

let fs1 = create ["MainNode";"nodeA";"nodeB"] (createEmptyFsTree())
let fs2 = create ["MainNode";"nodeC";"nodeD"] fs1
let fs3 = create ["MainNode";"nodeC";"nodeE"] fs2

結果は次のようになります。

Node [("MainNode", Node [

                             ("nodeA", Node [("nodeB", Node [])]);
                             ("nodeC", Node [
                                         ("nodeD", Node[]);
                                         ("nodeE", Node[])])])]

これはこれまでの私のコードです。私は2日間立ち往生しています。助けてください。

let create (p : string list) (fs : FsTree) =
        let rec create (p : string list) (fs : FsTree) =
            match fs with 
            | Node n -> match p, n with
                        | h :: t, (name, rsNode) :: rsTree when name = h -> Node([(h, (create t rsNode))] @ rsTree)
                        | _, lNode :: rsTree -> Node([lNode]@rsTree)
                        | h :: t, [] -> Node ([h, (create t (createEmptyFsTree()))])
                        | [],[] -> Node[]
        create p fs

渡された最初のパスからのみツリーを作成できます。

Node [("MainNode", Node [("nodeA", Node [("nodeB", Node [])])])]
AMieres

この問題の難しさは、それが機能するために同時に再帰的にトラバースする必要があるいくつかの構造(パスは、、list各ノードは、listおよびサブツリー)があることです。1つの関数だけでそうすることは、理解するのが非常に難しくなります。

そのため、問題を小さな部分に分割して単純化するのが好きです。ここでは、2つの相互再帰関数を使用します(構文に注意してください)。まず、関数の名前を変更して、関数の機能をよりよく理解できるようにします。また、混乱を招くため、関数と変数に同じ名前を繰り返すことは避けています。私の最初の関数は、パスのトラバースのみを処理しますp

let rec addPath (p : string list)   (Node ns) =
    match p with
    | []       -> Node                    ns
    | hp :: tp -> Node (addHeadPath hp tp ns)

2番目のパラメーターでパターンマッチングを使用して(Node ns)サブノードのリストを取得します。これは、次の関数がそのリストをトラバースするためです。

私のmatch表現では、再帰の終わりである空のリストの場合を最初に処理するのが好きです。2番目のケースでは、頭と尾を分離し、それらを別の関数に送信して処理します。

and addHeadPath hp tp ns =
    match ns with
    | []                          -> [hp, addPath tp (Node[]) ]
    | (nn, st) :: tn when nn = hp -> (nn, addPath tp st       ) ::                   tn
    | hn       :: tn              -> hn                         :: addHeadPath hp tp tn

addHeadPathToは相互に再帰的であるaddPathToためand、別のの代わりにそれらを結び付けますlet rec

ここでも、空のケースが最初に処理され、1つのノードを含むリストが返さaddPathToれ、残りのパスを追加するように呼び出されます。2番目のケースは、ノードがすでに存在する場合です。この場合、残りのパスをサブツリーに追加しstます。3番目のケースは、それ自体を再帰的に呼び出すことにより、ノードのリストを調べ続けます。

次のように呼び出します。

createEmptyFsTree()
|> addPath ["MainNode";"nodeA";"nodeB"] 
|> addPath ["MainNode";"nodeC";"nodeD"]
|> addPath ["MainNode";"nodeC";"nodeE"]    
|> printfn "%A"        

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Pythonでネストされたループを使用して、リストから指定された回数すべての文字列を出力する方法

分類Dev

指定された文字リストから文字列を作成できるかどうかを確認するにはどうすればよいですか?

分類Dev

ネストされた辞書値(ツリー)からリストのリストを作成する

分類Dev

c#で指定されたテキストファイルから2つの別々のリスト<文字列>を作成する方法

分類Dev

csvfileの指定された列からのデータを含むリストをPythonで作成します

分類Dev

リストからネストされたツリーを作成する

分類Dev

指定された文字から単語のリストを作成します

分類Dev

文字列のリストから分割された文字列から辞書を作成する

分類Dev

Python3の指定された値のリストから文字列の各文字の値を取得する方法は?

分類Dev

文字列からネストされたリストを作成する

分類Dev

パーツのリストからURLパスを作成するにはどうすればよいですか?

分類Dev

Pythonで複数のネストされた辞書/リストからツリーを作成します

分類Dev

文字列の配列から指定された文字を含む文字列のリストを取得します

分類Dev

PythonでIDのリストが文字列として言及されているパンダの列から一意のIDのリストを作成する方法

分類Dev

文字列に指定された文字が含まれている場合、リストから文字列を削除する

分類Dev

単語の与えられたリストを使用して、指定された文字列を再作成するいくつかの方法

分類Dev

ファイルのパスを含む文字列のリストからツリーを作成します-javascript

分類Dev

ファイルのパスを含む文字列のリストからツリーを作成します-javascript

分類Dev

ネストされたdictのリストからネストされた列を持つパンダデータフレームを作成する方法

分類Dev

列の値からソートされたリストを作成するためのパンダでの効率的かつ最速の方法

分類Dev

パスを含む文字列のリストからツリーを作成します

分類Dev

行に指定された文字列を含む列のリストを作成するにはどうすればよいですか?

分類Dev

ネストされたリストをパンダデータフレーム列内のリスト内で分解/スピルし、それらから個別の列を作成するにはどうすればよいですか?

分類Dev

タブで区切られた文字列からリストを作成する

分類Dev

指定された文字配列からすべての単語のリストを見つける方法

分類Dev

トランポリンを使用してネストされた配列からツリーを作成し、それを文字列に変換します

分類Dev

指定された文字列で数値のリストを作成するにはどうすればよいですか?

分類Dev

Pythonで情報の長い文字列からネストされたリストを再作成するにはどうすればよいですか?

分類Dev

ネストされた配列から祖先のリストを作成する

Related 関連記事

  1. 1

    Pythonでネストされたループを使用して、リストから指定された回数すべての文字列を出力する方法

  2. 2

    指定された文字リストから文字列を作成できるかどうかを確認するにはどうすればよいですか?

  3. 3

    ネストされた辞書値(ツリー)からリストのリストを作成する

  4. 4

    c#で指定されたテキストファイルから2つの別々のリスト<文字列>を作成する方法

  5. 5

    csvfileの指定された列からのデータを含むリストをPythonで作成します

  6. 6

    リストからネストされたツリーを作成する

  7. 7

    指定された文字から単語のリストを作成します

  8. 8

    文字列のリストから分割された文字列から辞書を作成する

  9. 9

    Python3の指定された値のリストから文字列の各文字の値を取得する方法は?

  10. 10

    文字列からネストされたリストを作成する

  11. 11

    パーツのリストからURLパスを作成するにはどうすればよいですか?

  12. 12

    Pythonで複数のネストされた辞書/リストからツリーを作成します

  13. 13

    文字列の配列から指定された文字を含む文字列のリストを取得します

  14. 14

    PythonでIDのリストが文字列として言及されているパンダの列から一意のIDのリストを作成する方法

  15. 15

    文字列に指定された文字が含まれている場合、リストから文字列を削除する

  16. 16

    単語の与えられたリストを使用して、指定された文字列を再作成するいくつかの方法

  17. 17

    ファイルのパスを含む文字列のリストからツリーを作成します-javascript

  18. 18

    ファイルのパスを含む文字列のリストからツリーを作成します-javascript

  19. 19

    ネストされたdictのリストからネストされた列を持つパンダデータフレームを作成する方法

  20. 20

    列の値からソートされたリストを作成するためのパンダでの効率的かつ最速の方法

  21. 21

    パスを含む文字列のリストからツリーを作成します

  22. 22

    行に指定された文字列を含む列のリストを作成するにはどうすればよいですか?

  23. 23

    ネストされたリストをパンダデータフレーム列内のリスト内で分解/スピルし、それらから個別の列を作成するにはどうすればよいですか?

  24. 24

    タブで区切られた文字列からリストを作成する

  25. 25

    指定された文字配列からすべての単語のリストを見つける方法

  26. 26

    トランポリンを使用してネストされた配列からツリーを作成し、それを文字列に変換します

  27. 27

    指定された文字列で数値のリストを作成するにはどうすればよいですか?

  28. 28

    Pythonで情報の長い文字列からネストされたリストを再作成するにはどうすればよいですか?

  29. 29

    ネストされた配列から祖先のリストを作成する

ホットタグ

アーカイブ