ホームページ  >  記事  >  バックエンド開発  >  パス文字列のリストから階層ツリー構造を構築するにはどうすればよいですか?

パス文字列のリストから階層ツリー構造を構築するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-31 00:15:29830ブラウズ

How to Build a Hierarchical Tree Structure from a List of Path Strings?

パス構造をツリーに変換する

パス文字列のコレクションからネストされたデータ構造を開発すると、特に次のものを扱う場合に課題が生じる可能性があります。ポインタと再帰。パス構造の配列から階層ツリーを作成するソリューションを調べてみましょう。

次の例を考えてみましょう:

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"
    }]
}]

私たちのソリューションは、次の重要な点で元のアプローチとは異なります:

  • 単一ノードの子ではなくノードのリストを操作します。
  • 既存のノードを再利用する代わりに新しいノードを作成し、重複を防ぎます。
  • ツリー内の既存のノードをチェックします。各ノードが 1 回だけ追加されるようにします。

以上がパス文字列のリストから階層ツリー構造を構築するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。