亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 GO 中的父/子對構建樹結構

從 GO 中的父/子對構建樹結構

Go
紅顏莎娜 2022-05-05 16:05:23
我正在嘗試從 Go 中的父 x 子數據集構建樹結構。最終數據將來自 MySQL 表,但為了簡化此示例,我已將數據庫從等式中刪除并創建了一個數組?!艾F實生活”解決方案的原理相同。數據源如下所示:--------------------------     身份證 | 家長--------------------------     1 | 0     2 | 1     3 | 1     4 | 0     5 | 4     6 | 4     7 | 0     8 | 7     9 | 2The Parent colunm refer back to the ID column forming the parent x child relationship. ID's with parent = 0 are root elements.這是我解決這個問題的嘗試。它適用于根元素和第一級子元素,但它不會比樹中的更深。我的理解是,我需要一個遞歸循環來實現我想要的,但我無法解決更深層次的問題。https://play.golang.org/p/6m0YTqe529O上述數據源的預期輸出是一個分層樹,如下所示:(以 JSON 表示以方便可視化)。[{        "id": 1,        "child": [{                "id": 2,                "child": [{                    "id": 9                }]            },            {                "id": 3            }        ]    },    {        "id": 4,        "child": [{            "id": 5        }, {            "id": 6        }]    },    {        "id": 7,        "child": [{            "id": 8        }]    }]我在 SO 上看到過類似的問題,但答案要么不高于第一級,要么根本不能完全解決問題。
查看完整描述

1 回答

?
慕娘9325324

TA貢獻1783條經驗 獲得超4個贊

首先,除非你真的必須這樣做,否則你不應該使用指向切片的指針。為變量分配返回值更為典型,例如mySlice = sliceReturningFunction().

我不確定這里的所有要求是什么,但一種解決方案可能是:

  1. 構建父子關系圖(map[int][]int)。

  2. 將根級關系傳遞給遞歸構建類別的函數。

這是一個示例遞歸函數。請注意,它返回一個新切片而不是改變一個指針。

func buildCategories(ids []int, relations map[int][]int) []Category {

    categories := make([]Category, len(ids))

    for i, id := range ids {

        c := Category{ID: id}

        if childIDs, ok := relations[id]; ok {

            c.Child = buildCategories(childIDs, relations)

        }

        categories[i] = c

    }

    return categories

}

我在 Playground 上添加了一個完整的示例。它沒有經過測試,我相信有更好的解決方案,但它很簡單,至少可以給你一些想法。如果您將擁有數千個節點并且經常訪問這些節點,那么您將需要在 Go 代碼之外進行優化。


查看完整回答
反對 回復 2022-05-05
  • 1 回答
  • 0 關注
  • 192 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號