第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Golang:根據(jù) id 和父 id 從線性數(shù)組創(chuàng)建嵌套

Golang:根據(jù) id 和父 id 從線性數(shù)組創(chuàng)建嵌套

Go
www說 2022-11-23 10:17:54
我有一個(gè)名稱的數(shù)據(jù)線性,例如:名稱:一個(gè),ID:1,ParentId:0名稱:一對(duì)一,ID:2,ParentId:1名稱:一對(duì)一,ID:3,ParentId:2名稱:一一二,ID:4,ParentId:2例如這個(gè)數(shù)據(jù),我從數(shù)據(jù)庫中獲取,但我想測試我制作虛擬數(shù)據(jù)來構(gòu)造的邏輯。我想我為數(shù)據(jù)遞歸地做了一個(gè)臨時(shí)索引。如果地圖中不存在數(shù)據(jù),我會(huì)設(shè)置,如果數(shù)據(jù)必須附加到切片之前,我會(huì)得到索引。但是,我認(rèn)為在函數(shù)遞歸中(我在下面顯示),它不起作用(數(shù)據(jù)不附加)。為什么?有沒有錯(cuò)誤的算法邏輯?我的結(jié)果的正確解決方案是什么[  {    "id": 1,    "name": "One",    "children": [      {        "id": 2,        "name": "One-One",        "children": [          {            "id": 3,            "name": "One-One-One",            "children": null          },          {            "id": 4,            "name": "One-One-Two",            "children": null          }        ]      }    ]  }]golang 中的完整代碼:package mainimport (    "encoding/json"    "fmt")type Data struct {    Id       int    `json:"id"`    ParentId int    `json:"parent_id"`    Name     string `json:"name"`}type Datas []Datatype Response struct {    Id       int       `json:"id"`    Name     string    `json:"name"`    Children Responses `json:"children"`}type Responses []*Responsefunc main() {    datas := Datas{        {            Name: "One",            Id:   1,        },        {            Name:     "One-One",            Id:       2,            ParentId: 1,        },        {            Name:     "One-One-One",            Id:       3,            ParentId: 2,        },        {            Name:     "One-One-Two",            Id:       4,            ParentId: 2,        },    }    var result Responses    tempIdx := make(map[int]int)    for _, val := range datas {        res := Response{            Id:   val.Id,            Name: val.Name,        }        if val.ParentId == 0 {            result = append(result, &res)            tempIdx[val.Id] = len(result) - 1            continue        } else {            recursive(val.ParentId, result, res, tempIdx)        }    }    json, err := json.Marshal(result)    if err != nil {        panic(err)    }    fmt.Println(string(json))}用Golang Playground打開
查看完整描述

1 回答

?
阿晨1998

TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊

切片不是數(shù)組

附加到函數(shù)中的切片不會(huì)增加原始切片的長度和容量。


change := func(slice []int) {

    slice = append(slice, 3)

}

slice := []int{1, 2}

change(slice)

fmt.Println(slice) 

// Output: [1 2]

無論如何,即使您解決了切片問題,您的輸出也不會(huì)像預(yù)期的那樣。您基本上使用的是樹數(shù)據(jù)結(jié)構(gòu),因此建議使用一些樹搜索算法。這是您使用BFS的工作示例


package main


import (

    "encoding/json"

    "fmt"

)


type Data struct {

    Id       int    `json:"id"`

    ParentId int    `json:"parent_id"`

    Name     string `json:"name"`

}


type Datas []Data


type Response struct {

    Id       int       `json:"id"`

    Name     string    `json:"name"`

    Children Responses `json:"children"`

}


type Responses []*Response


func main() {

    datas := Datas{

        {

            Name: "One",

            Id:   1,

        },

        {

            Name:     "One-One",

            Id:       2,

            ParentId: 1,

        },

        {

            Name:     "One-One-One",

            Id:       3,

            ParentId: 2,

        },

        {

            Name:     "One-One-Two",

            Id:       4,

            ParentId: 2,

        },

    }


    var result Responses

    for _, val := range datas {

        res := &Response{

            Id:   val.Id,

            Name: val.Name,

        }


        var found bool


        // iterate trough root nodes

        for _, root := range result {

            parent := findById(root, val.ParentId)

            if parent != nil {

                parent.Children = append(parent.Children, res)


                found = true

                break

            }

        }


        if !found {

            result = append(result, res)

        }

    }


    out, err := json.Marshal(result)

    if err != nil {

        panic(err)

    }

    fmt.Println(string(out))

}


func findById(root *Response, id int) *Response {

    queue := make([]*Response, 0)

    queue = append(queue, root)

    for len(queue) > 0 {

        nextUp := queue[0]

        queue = queue[1:]

        if nextUp.Id == id {

            return nextUp

        }

        if len(nextUp.Children) > 0 {

            for _, child := range nextUp.Children {

                queue = append(queue, child)

            }

        }

    }

    return nil

}



查看完整回答
反對(duì) 回復(fù) 2022-11-23
  • 1 回答
  • 0 關(guān)注
  • 130 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)