मैं की tuples पूर्णांक * स्ट्रिंग एक सूची है करने के लिए सूची को बदलने जहां पूर्णांक स्तर है और स्ट्रिंग नामएफ # एक पेड़
let src = [
(0, "root");
(1, "a");
(2, "a1");
(2, "a2");
(1, "b");
(2, "b1");
(3, "b11");
(2, "b2");
]
है और मैं इसे
let expectingTree =
Branch("root",
[
Branch("a",
[
Leaf("a1");
Leaf("a2")
]);
Branch("b",
[
Branch("b1", [Leaf("b11")]);
Leaf("b2")
]);
]);
निम्नलिखित नीचे करने के लिए बदलने की जरूरत है जिस तरह से मैंने इसे किया, लेकिन क्या कोई इसे हासिल करने के बेहतर तरीके से सलाह दे सकता था। मैं एफ # के लिए नया हूं, और सी # कोड एक ही काम करने के लिए कुछ छोटा होगा, इसलिए मुझे लगता है कि मैं इसे गलत कर रहा हूं। सब से
type Node =
| Branch of (string * Node list)
| Leaf of string
let src = [
(0, "root");
(1, "a");
(2, "a1");
(2, "a2");
(1, "b");
(2, "b1");
(3, "b11");
(2, "b2");
]
let rec setParents (level:int) (parents:list<int>) (lst:list<int*int*string>) : list<int*int*string> =
//skip n items and return the rest
let rec skip n xs =
match (n, xs) with
| n, _ when n <= 0 -> xs
| _, [] -> []
| n, _::xs -> skip (n-1) xs
//get parent id for given level
let parentId (level) =
let n = List.length parents - (level + 1)
skip n parents |> List.head
//create new parent list and append new id to begin
let newParents level id =
let n = List.length parents - (level + 1)
id :: skip n parents
match lst with
| (id, l, n) :: tail ->
if l = level then (id, parentId(l), n) :: setParents l (newParents l id) tail
elif l <= level + 1 then setParents l parents lst
else [] //items should be in order, e.g. there shouldnt be item with level 5 after item with level 3
| _ -> []
let rec getTree (root:int) (lst: list<int*int*string>) =
let getChildren parent =
List.filter (fun (_, p, _) -> p = parent) lst
let rec getTreeNode (id:int) (name:string) =
let children = getChildren id
match List.length children with
| 0 -> Leaf(name)
| _ -> Branch(name,
children
|> List.map (fun (_id, _, _name) -> getTreeNode _id _name))
match getChildren root with
| (id, _, n) :: _ -> getTreeNode id n
| _ -> Leaf("")
let rec printTree (ident:string) (tree:Node) =
match tree with
| Leaf(name) ->
printfn "%s%s" ident name
| Branch(name, children) ->
printfn "%s%s" ident name
List.iter (fun (node) -> printTree (" " + ident) node) children
let tree =
src
|> List.mapi (fun i (l, n) -> (i+1, l, n)) //set unique id to each item
|> setParents 0 [0] //set parentId to each item
|> getTree 0
printTree "" tree
Console.ReadKey() |> ignore
उत्कृष्ट, धन्यवाद –