Use map to quickly find children in BuildTreeFromFiles

This commit is contained in:
partho.kunda 2024-09-18 03:11:54 +06:00 committed by Stefan Haller
parent c67979abbb
commit b18f12ca0f

View file

@ -10,6 +10,8 @@ import (
func BuildTreeFromFiles(files []*models.File) *Node[models.File] { func BuildTreeFromFiles(files []*models.File) *Node[models.File] {
root := &Node[models.File]{} root := &Node[models.File]{}
childrenMapsByNode := make(map[*Node[models.File]]map[string]*Node[models.File])
var curr *Node[models.File] var curr *Node[models.File]
for _, file := range files { for _, file := range files {
splitPath := split(file.Name) splitPath := split(file.Name)
@ -23,11 +25,19 @@ func BuildTreeFromFiles(files []*models.File) *Node[models.File] {
} }
path := join(splitPath[:i+1]) path := join(splitPath[:i+1])
for _, existingChild := range curr.Children {
if existingChild.Path == path { var currNodeChildrenMap map[string]*Node[models.File]
curr = existingChild var isCurrNodeMapped bool
continue outer
} if currNodeChildrenMap, isCurrNodeMapped = childrenMapsByNode[curr]; !isCurrNodeMapped {
currNodeChildrenMap = make(map[string]*Node[models.File])
childrenMapsByNode[curr] = currNodeChildrenMap
}
child, doesCurrNodeHaveChildAlready := currNodeChildrenMap[path]
if doesCurrNodeHaveChildAlready {
curr = child
continue outer
} }
newChild := &Node[models.File]{ newChild := &Node[models.File]{
@ -36,6 +46,8 @@ func BuildTreeFromFiles(files []*models.File) *Node[models.File] {
} }
curr.Children = append(curr.Children, newChild) curr.Children = append(curr.Children, newChild)
currNodeChildrenMap[path] = newChild
curr = newChild curr = newChild
} }
} }