Heim >Backend-Entwicklung >Golang >Wie kann ich diese Verschachtelungslogik verbessern, damit sie ordnungsgemäß funktioniert und die Leistung verbessert?
PHP-Editor Yuzai, möglicherweise sind beim Schreiben von Code Probleme mit verschachtelter Logik aufgetreten, die dazu geführt haben, dass der Code nicht richtig funktioniert oder eine geringe Leistung aufweist. Um dieses Problem zu lösen, müssen mehrere wichtige Punkte berücksichtigt werden. Zunächst können Sie Ihre logische Struktur überprüfen, um zu sehen, ob Sie Ihren Code vereinfachen oder umstrukturieren können, um den Verschachtelungsgrad zu reduzieren. Zweitens können Sie erwägen, geeignete Datenstrukturen und Algorithmen zu verwenden, um Ihren Code zu optimieren. Stellen Sie außerdem sicher, dass Ihr Code keine Berechnungen oder redundanten Vorgänge dupliziert, um die Leistung zu verbessern. Führen Sie abschließend geeignete Tests und Debugging durch, um sicherzustellen, dass Ihr Code unter verschiedenen Umständen ordnungsgemäß funktioniert. Mit diesen Methoden können Sie die verschachtelte Logik verbessern und die Leistung Ihres Codes verbessern.
Ich habe eine Datenbank mit Kommentaren, jeder Kommentar hat eine ID und eine übergeordnete ID. Das Ziel besteht lediglich darin, jeden Kommentar mit einer übergeordneten ID auf effiziente Weise unter seinem übergeordneten Kommentar zu platzieren.
Ich habe zunächst eine rekursive Funktion verwendet, um die übergeordnete Annotation im arranged
-Array zu durchsuchen, aber die Leistung war schrecklich. Ich habe umgestaltet, um Zeiger zu verwenden, um das übergeordnete Element zu verfolgen, was fast perfekt funktioniert, aber es scheint, als ob der letzte zu verarbeitende Kommentar immer von der Ausgabe ausgeschlossen wird.
Im Beispiel unten sollte „Kommentar 1“ ein untergeordnetes Element von „Kommentar 11“ sein, es ist jedoch überhaupt nicht in der Ausgabe enthalten.
package main import ( "encoding/json" "fmt" ) // Comment from Database type Comment struct { ID string `json:"id""` ParentID string `json:"pid"` Text string `json:"text"` } // NestedComment output type NestedComment struct { Comment Children []NestedComment `json:"children,omitempty"` } func main() { // Some comment data from DB jsondata := `[{"id":"f1c3a838-f4b4-4ebd-bb1b-d3e4c0dce27d","pid":"6a162b3f-9341-46e9-95f7-dedc6cd06868","text":"comment 1"},{"id":"131cf4bb-1971-43a2-992f-2cbb042a4184","pid":"","text":"comment 2"},{"id":"4c93a789-ecab-4173-954c-b039cd3a9e17","pid":"131cf4bb-1971-43a2-992f-2cbb042a4184","text":"comment 3"},{"id":"c7974b6d-67e1-47d0-84fa-c78d51682df2","pid":"131cf4bb-1971-43a2-992f-2cbb042a4184","text":"comment 4"},{"id":"386c4439-4596-47c1-99bf-cb479055fe5a","pid":"","text":"comment 5"},{"id":"5ef0816e-ea13-4a7e-8009-e67ee08ef906","pid":"386c4439-4596-47c1-99bf-cb479055fe5a","text":"comment 6"},{"id":"96b0a536-602b-4f3f-a352-020f22cdfb18","pid":"","text":"comment 7"},{"id":"d0f11e98-deea-4fd5-becb-8f406ebcae83","pid":"96b0a536-602b-4f3f-a352-020f22cdfb18","text":"comment 8"},{"id":"bad87461-3cbf-4ecb-a8c7-36876b57d652","pid":"","text":"comment 9"},{"id":"e3ee6f90-495f-4348-9c29-bd6e15ec3b39","pid":"bad87461-3cbf-4ecb-a8c7-36876b57d652","text":"comment 10"},{"id":"6a162b3f-9341-46e9-95f7-dedc6cd06868","pid":"","text":"comment 11"},{"id":"041c7c2d-0688-491e-b6cd-899eac95bd3d","pid":"","text":"comment 12"},{"id":"5acdf3ff-345b-47a5-bd66-a6687a1441b7","pid":"041c7c2d-0688-491e-b6cd-899eac95bd3d","text":"comment 13"},{"id":"aaee2ae5-7e3a-4435-a094-83bf6b77abfb","pid":"","text":"comment 14"},{"id":"6108b28c-a7af-4c5a-a38c-c22db0d34b31","pid":"aaee2ae5-7e3a-4435-a094-83bf6b77abfb","text":"comment 15"},{"id":"1736393e-95b0-4f5d-a149-50fe52c28350","pid":"","text":"comment 16"},{"id":"b646f202-17aa-4af9-b8dc-c1d8ff3529ac","pid":"1736393e-95b0-4f5d-a149-50fe52c28350","text":"comment 17"},{"id":"a8827b1d-fdbc-41c2-bdb5-38e8b308dedc","pid":"b646f202-17aa-4af9-b8dc-c1d8ff3529ac","text":"comment 18"},{"id":"76e49597-6039-4cb5-a595-556ccc2e3c12","pid":"a8827b1d-fdbc-41c2-bdb5-38e8b308dedc","text":"comment 19"},{"id":"07dc4b90-65d3-4f75-8351-457305988235","pid":"76e49597-6039-4cb5-a595-556ccc2e3c12","text":"comment 20"},{"id":"2d4e838b-82df-4ca0-bf9b-f1dfb99d6763","pid":"07dc4b90-65d3-4f75-8351-457305988235","text":"comment 21"},{"id":"617c1760-0dca-409c-af2a-c614f0530e07","pid":"","text":"comment 22"},{"id":"712c0b7e-a9e4-40fd-ab78-c39b483b1435","pid":"617c1760-0dca-409c-af2a-c614f0530e07","text":"comment 23"},{"id":"e325094c-886e-42c9-bd59-fdd7a189b384","pid":"","text":"comment 24"},{"id":"f3b8b0f9-edef-4ee6-9555-42e8595f854c","pid":"e325094c-886e-42c9-bd59-fdd7a189b384","text":"comment 25"},{"id":"6e09a231-a2ee-4aa1-a898-57695e6fe153","pid":"","text":"comment 26"},{"id":"63e629d6-c0f9-4b36-ad96-e0c47cf8bb4e","pid":"6e09a231-a2ee-4aa1-a898-57695e6fe153","text":"comment 27"},{"id":"d7b698f1-8757-46db-a6e6-5141a481b42b","pid":"","text":"comment 28"},{"id":"a7e3d522-553c-44f1-befa-047bd94f0e59","pid":"","text":"comment 29"},{"id":"fe78ce24-c2c8-4d00-b96d-8b8be9ce0f06","pid":"","text":"comment 30"},{"id":"fabdccb5-a024-4476-bd51-7d55fb685c42","pid":"","text":"comment 31"},{"id":"608d0693-6e43-46a0-9e54-107da6adb109","pid":"fabdccb5-a024-4476-bd51-7d55fb685c42","text":"comment 32"}]` var comments []Comment err := json.Unmarshal([]byte(jsondata), &comments) if err != nil { panic(err) } arranged := ArrangeComments(comments, len(comments)) arrangedjson, _ := json.MarshalIndent(arranged, "", " ") fmt.Println(string(arrangedjson)) fmt.Println("comments", len(comments), "arranged", recursiveCount(arranged)) } func recursiveCount(arranged []NestedComment) int { count := len(arranged) for _, item := range arranged { count += recursiveCount(item.Children) } return count } // Nesting function ------------------------------------------------------------------------- func ArrangeComments(queue []Comment, count int) []NestedComment { var arranged []NestedComment // using pointers over a recursive search var refs []*NestedComment // some comments are orphaned, se we need a bail out tries := 0 maxTries := 5 prevPlacedLen := 0 // IDs of placed comments var placed []string // while count is greater then length of placed countloop: for count > len(placed) { // loop through queue queueloop: for _, item := range queue { // skip if already placed if len(placed) > 0 { for _, id := range placed { if id == item.ID { continue queueloop } } } // if parent is nil, add to arranged if item.ParentID == "" { arranged = append(arranged, NestedComment{ Comment: item, }) refs = append(refs, &arranged[len(arranged)-1]) placed = append(placed, item.ID) } else { // if parent is not nil, loop through refs and add to children refloop: for _, ref := range refs { if ref.ID == item.ParentID { ref.Children = append(ref.Children, NestedComment{Comment: item}) refs = append(refs, &ref.Children[len(ref.Children)-1]) placed = append(placed, item.ID) break refloop } } } } // if no comments were placed, bail out after x tries if len(placed) == prevPlacedLen { if tries >= maxTries { break countloop } tries++ break } prevPlacedLen = len(placed) } return arranged }
Update; das brachte mich näher, konnte aber einige tiefer verschachtelte Kommentare nicht verschachteln. Seltsamerweise erzeugt es bei jeder Ausführung eine andere Ausgabe:
func ArrangeComments(comments []Comment) []NestedComment { // Map to hold references to NestedComment by their ID queue := make(map[string]*NestedComment) // Result slice var result []NestedComment // First, create all NestedComments and store references in the map for _, comment := range comments { nc := &NestedComment{Comment: comment} queue[comment.ID] = nc } // Second, loop through the map and add children to their parents for _, comment := range queue { if comment.ParentID != "" { parent := queue[comment.Comment.ParentID] if parent != nil { parent.Children = append(parent.Children, *comment) } } } // Third, loop through the map and add all root comments to the result slice for _, comment := range queue { if comment.ParentID == "" { result = append(result, *comment) } } return result }
Update; ich habe schnell eine JavaScript-Implementierung geschrieben, die bei denselben Beispieldaten die richtigen Ergebnisse liefert, aber ich kann nicht herausfinden, warum dieser JS-Code funktioniert und der Go-Code nicht.
const datajson = `[{"id":"f1c3a838-f4b4-4ebd-bb1b-d3e4c0dce27d","pid":"6a162b3f-9341-46e9-95f7-dedc6cd06868","text":"comment 1"},{"id":"131cf4bb-1971-43a2-992f-2cbb042a4184","pid":"","text":"comment 2"},{"id":"4c93a789-ecab-4173-954c-b039cd3a9e17","pid":"131cf4bb-1971-43a2-992f-2cbb042a4184","text":"comment 3"},{"id":"c7974b6d-67e1-47d0-84fa-c78d51682df2","pid":"131cf4bb-1971-43a2-992f-2cbb042a4184","text":"comment 4"},{"id":"386c4439-4596-47c1-99bf-cb479055fe5a","pid":"","text":"comment 5"},{"id":"5ef0816e-ea13-4a7e-8009-e67ee08ef906","pid":"386c4439-4596-47c1-99bf-cb479055fe5a","text":"comment 6"},{"id":"96b0a536-602b-4f3f-a352-020f22cdfb18","pid":"","text":"comment 7"},{"id":"d0f11e98-deea-4fd5-becb-8f406ebcae83","pid":"96b0a536-602b-4f3f-a352-020f22cdfb18","text":"comment 8"},{"id":"bad87461-3cbf-4ecb-a8c7-36876b57d652","pid":"","text":"comment 9"},{"id":"e3ee6f90-495f-4348-9c29-bd6e15ec3b39","pid":"bad87461-3cbf-4ecb-a8c7-36876b57d652","text":"comment 10"},{"id":"6a162b3f-9341-46e9-95f7-dedc6cd06868","pid":"","text":"comment 11"},{"id":"041c7c2d-0688-491e-b6cd-899eac95bd3d","pid":"","text":"comment 12"},{"id":"5acdf3ff-345b-47a5-bd66-a6687a1441b7","pid":"041c7c2d-0688-491e-b6cd-899eac95bd3d","text":"comment 13"},{"id":"aaee2ae5-7e3a-4435-a094-83bf6b77abfb","pid":"","text":"comment 14"},{"id":"6108b28c-a7af-4c5a-a38c-c22db0d34b31","pid":"aaee2ae5-7e3a-4435-a094-83bf6b77abfb","text":"comment 15"},{"id":"1736393e-95b0-4f5d-a149-50fe52c28350","pid":"","text":"comment 16"},{"id":"b646f202-17aa-4af9-b8dc-c1d8ff3529ac","pid":"1736393e-95b0-4f5d-a149-50fe52c28350","text":"comment 17"},{"id":"a8827b1d-fdbc-41c2-bdb5-38e8b308dedc","pid":"b646f202-17aa-4af9-b8dc-c1d8ff3529ac","text":"comment 18"},{"id":"76e49597-6039-4cb5-a595-556ccc2e3c12","pid":"a8827b1d-fdbc-41c2-bdb5-38e8b308dedc","text":"comment 19"},{"id":"07dc4b90-65d3-4f75-8351-457305988235","pid":"76e49597-6039-4cb5-a595-556ccc2e3c12","text":"comment 20"},{"id":"2d4e838b-82df-4ca0-bf9b-f1dfb99d6763","pid":"07dc4b90-65d3-4f75-8351-457305988235","text":"comment 21"},{"id":"617c1760-0dca-409c-af2a-c614f0530e07","pid":"","text":"comment 22"},{"id":"712c0b7e-a9e4-40fd-ab78-c39b483b1435","pid":"617c1760-0dca-409c-af2a-c614f0530e07","text":"comment 23"},{"id":"e325094c-886e-42c9-bd59-fdd7a189b384","pid":"","text":"comment 24"},{"id":"f3b8b0f9-edef-4ee6-9555-42e8595f854c","pid":"e325094c-886e-42c9-bd59-fdd7a189b384","text":"comment 25"},{"id":"6e09a231-a2ee-4aa1-a898-57695e6fe153","pid":"","text":"comment 26"},{"id":"63e629d6-c0f9-4b36-ad96-e0c47cf8bb4e","pid":"6e09a231-a2ee-4aa1-a898-57695e6fe153","text":"comment 27"},{"id":"d7b698f1-8757-46db-a6e6-5141a481b42b","pid":"","text":"comment 28"},{"id":"a7e3d522-553c-44f1-befa-047bd94f0e59","pid":"","text":"comment 29"},{"id":"fe78ce24-c2c8-4d00-b96d-8b8be9ce0f06","pid":"","text":"comment 30"},{"id":"fabdccb5-a024-4476-bd51-7d55fb685c42","pid":"","text":"comment 31"},{"id":"608d0693-6e43-46a0-9e54-107da6adb109","pid":"fabdccb5-a024-4476-bd51-7d55fb685c42","text":"comment 32"}]` const queue = JSON.parse(datajson) const result = [] const queueMap = new Map(queue.map(item => [item.id, item])) for (const item of queue) { if (item.pid !== '') { const parent = queueMap.get(item.pid) if (parent) { if (!parent.children) { parent.children = [] } parent.children.push(item) } } } for (const [_, value] of queueMap) { if (value.pid === '') { result.push(value) } } function recursiveCount(res) { let count = res.length res.forEach(item => { if (item.children) { count += recursiveCount(item.children) } }); return count } console.log(JSON.stringify(result, null, 2)) console.log("comments", queue.length, "arranged", recursiveCount(result))
Runnable Go-Beispiel: https://gist.github.com/dlford/9e66069cfc7fb9afc649c5e3dc650083
Ausführbares JS-Beispiel: https://gist.github.com/dlford/f6f4a383a99f65659895ed51d1a4b651
Go-Code-Ausgabe (siehe Anzahl unten): https://gist.github.com/dlford/302c4db939c21d15132848368caa01ec
JS-Code-Ausgabe (siehe Anzahl unten): https://gist.github.com/dlford/60ab49d0466c957c7745059022e27e09
Das Problem ist, dass NestedComment
中的 Children
auch als Zeiger gespeichert werden muss.
Arbeitsbeispiel:
package main import ( "encoding/json" "fmt" ) // Comment from Database type Comment struct { ID string `json:"id"` ParentID string `json:"pid"` Text string `json:"text"` } // NestedComment output type NestedComment struct { Comment Children []*NestedComment `json:"children,omitempty"` } func main() { // Some comment data from DB jsondata := `[{"id":"f1c3a838-f4b4-4ebd-bb1b-d3e4c0dce27d","pid":"6a162b3f-9341-46e9-95f7-dedc6cd06868","text":"comment 1"},{"id":"131cf4bb-1971-43a2-992f-2cbb042a4184","pid":"","text":"comment 2"},{"id":"4c93a789-ecab-4173-954c-b039cd3a9e17","pid":"131cf4bb-1971-43a2-992f-2cbb042a4184","text":"comment 3"},{"id":"c7974b6d-67e1-47d0-84fa-c78d51682df2","pid":"131cf4bb-1971-43a2-992f-2cbb042a4184","text":"comment 4"},{"id":"386c4439-4596-47c1-99bf-cb479055fe5a","pid":"","text":"comment 5"},{"id":"5ef0816e-ea13-4a7e-8009-e67ee08ef906","pid":"386c4439-4596-47c1-99bf-cb479055fe5a","text":"comment 6"},{"id":"96b0a536-602b-4f3f-a352-020f22cdfb18","pid":"","text":"comment 7"},{"id":"d0f11e98-deea-4fd5-becb-8f406ebcae83","pid":"96b0a536-602b-4f3f-a352-020f22cdfb18","text":"comment 8"},{"id":"bad87461-3cbf-4ecb-a8c7-36876b57d652","pid":"","text":"comment 9"},{"id":"e3ee6f90-495f-4348-9c29-bd6e15ec3b39","pid":"bad87461-3cbf-4ecb-a8c7-36876b57d652","text":"comment 10"},{"id":"6a162b3f-9341-46e9-95f7-dedc6cd06868","pid":"","text":"comment 11"},{"id":"041c7c2d-0688-491e-b6cd-899eac95bd3d","pid":"","text":"comment 12"},{"id":"5acdf3ff-345b-47a5-bd66-a6687a1441b7","pid":"041c7c2d-0688-491e-b6cd-899eac95bd3d","text":"comment 13"},{"id":"aaee2ae5-7e3a-4435-a094-83bf6b77abfb","pid":"","text":"comment 14"},{"id":"6108b28c-a7af-4c5a-a38c-c22db0d34b31","pid":"aaee2ae5-7e3a-4435-a094-83bf6b77abfb","text":"comment 15"},{"id":"1736393e-95b0-4f5d-a149-50fe52c28350","pid":"","text":"comment 16"},{"id":"b646f202-17aa-4af9-b8dc-c1d8ff3529ac","pid":"1736393e-95b0-4f5d-a149-50fe52c28350","text":"comment 17"},{"id":"a8827b1d-fdbc-41c2-bdb5-38e8b308dedc","pid":"b646f202-17aa-4af9-b8dc-c1d8ff3529ac","text":"comment 18"},{"id":"76e49597-6039-4cb5-a595-556ccc2e3c12","pid":"a8827b1d-fdbc-41c2-bdb5-38e8b308dedc","text":"comment 19"},{"id":"07dc4b90-65d3-4f75-8351-457305988235","pid":"76e49597-6039-4cb5-a595-556ccc2e3c12","text":"comment 20"},{"id":"2d4e838b-82df-4ca0-bf9b-f1dfb99d6763","pid":"07dc4b90-65d3-4f75-8351-457305988235","text":"comment 21"},{"id":"617c1760-0dca-409c-af2a-c614f0530e07","pid":"","text":"comment 22"},{"id":"712c0b7e-a9e4-40fd-ab78-c39b483b1435","pid":"617c1760-0dca-409c-af2a-c614f0530e07","text":"comment 23"},{"id":"e325094c-886e-42c9-bd59-fdd7a189b384","pid":"","text":"comment 24"},{"id":"f3b8b0f9-edef-4ee6-9555-42e8595f854c","pid":"e325094c-886e-42c9-bd59-fdd7a189b384","text":"comment 25"},{"id":"6e09a231-a2ee-4aa1-a898-57695e6fe153","pid":"","text":"comment 26"},{"id":"63e629d6-c0f9-4b36-ad96-e0c47cf8bb4e","pid":"6e09a231-a2ee-4aa1-a898-57695e6fe153","text":"comment 27"},{"id":"d7b698f1-8757-46db-a6e6-5141a481b42b","pid":"","text":"comment 28"},{"id":"a7e3d522-553c-44f1-befa-047bd94f0e59","pid":"","text":"comment 29"},{"id":"fe78ce24-c2c8-4d00-b96d-8b8be9ce0f06","pid":"","text":"comment 30"},{"id":"fabdccb5-a024-4476-bd51-7d55fb685c42","pid":"","text":"comment 31"},{"id":"608d0693-6e43-46a0-9e54-107da6adb109","pid":"fabdccb5-a024-4476-bd51-7d55fb685c42","text":"comment 32"}]` var comments []Comment err := json.Unmarshal([]byte(jsondata), &comments) if err != nil { panic(err) } arranged := ArrangeComments(comments) arrangedjson, _ := json.MarshalIndent(arranged, "", " ") fmt.Println(string(arrangedjson)) fmt.Println("comments", len(comments), "arranged", recursiveCount(arranged)) } func recursiveCount(arranged []*NestedComment) int { count := len(arranged) for _, item := range arranged { count += recursiveCount(item.Children) } return count } // Nesting function ------------------------------------------------------------------------- func ArrangeComments(comments []Comment) []*NestedComment { // Map to hold references to NestedComment by their ID queue := make(map[string]*NestedComment) // Result slice var result []*NestedComment // First, create all NestedComments and store references in the map for _, comment := range comments { nc := &NestedComment{Comment: comment} queue[comment.ID] = nc } // Second, loop through the map and add children to their parents for _, comment := range queue { if comment.ParentID != "" { parent := queue[comment.Comment.ParentID] if parent != nil { parent.Children = append(parent.Children, comment) } } } // Third, loop through the map and add all root comments to the result slice for _, comment := range queue { if comment.ParentID == "" { result = append(result, comment) } } return result }
Das obige ist der detaillierte Inhalt vonWie kann ich diese Verschachtelungslogik verbessern, damit sie ordnungsgemäß funktioniert und die Leistung verbessert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!