パス構造をツリーに変換する
パス文字列のコレクションからネストされたデータ構造を開発すると、特に次のものを扱う場合に課題が生じる可能性があります。ポインタと再帰。パス構造の配列から階層ツリーを作成するソリューションを調べてみましょう。
次の例を考えてみましょう:
s:=[]string { "a/b/c", "a/b/g", "a/d" }
私たちの目標は、次の JSON 構造に似たツリーを構築することです。
{ "name": "a", "children": [ { "name": "b", "children": [ { "name": "c", "children": [] }, { "name": "g", "children": [] } ] }, { "name": "d", "children": [] } ] }
これを実現するには、既存のツリーとパス セグメントのリストを取得する AddToTree という再帰関数を実装します。
func AddToTree(root []Node, names []string) []Node { if len(names) > 0 { var i int for i = 0; i < len(root); i++ { if root[i].Name == names[0] { //already in tree break } } if i == len(root) { root = append(root, Node{Name: names[0]}) } root[i].Children = AddToTree(root[i].Children, names[1:]) } return root }
この関数は、既存のツリーを走査して、指定されたノードはすでに存在します。存在する場合は、パスの次のセグメントに進みます。それ以外の場合は、指定された名前で新しいノードを作成し、既存のツリーに追加します。
Example output (note that I used omitempty on the children field, because I don't like null entries in my JSONs): [{ "name": "a", "children": [{ "name": "b", "children": [{ "name": "c" }, { "name": "g" }] }, { "name": "d" }] }]
私たちのソリューションは、次の重要な点で元のアプローチとは異なります:
以上がパス文字列のリストから階層ツリー構造を構築するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。