猿问

go - 如何在映射带有子切片的结构时降低时间复杂度?

假设有以下Unload结构,它作为来自微服务 A 的单个元素响应,并且每个Item最初都有一个空Units切片:


type Unload struct {

    UnloadCode   string

    Orders      []Order

}


type Order struct {

    OrderCode    string

    Items        []Item

}


type Item struct {

    ItemCode    string

    Units     []string

}

还有一个ItemUnit结构,它来自微服务 B 的切片响应:


type ItemUnit struct {

    ItemCode    string

    Units       []Unit

}


type Unit struct {

    UnitName    string

}

我们需要根据两边的相似性来填充Item,Units切片的对应UnitName值。ItemCodes


为了解决这个问题,我设法提出了以下解决方案:


for orderIndex, order := range unload.Orders {

    for itemIndex, item := range order.Items {

        for _, itemUnit := range itemUnits {

            if item.ItemCode == itemUnit.ItemCode {

                for _, unit := range itemUnit.Units {

                    unload.Orders[orderIndex].Items[itemIndex].Units = append(unload.Orders[orderIndex].Items[itemIndex].Units, unit.UnitName)

                }

            }

        }

    }

}

我自己不是围棋专家,但在我看来,这个解决方案的时间复杂度成本非常高。是否有任何其他更优雅且可能具有更小时间复杂度的方法来解决这个问题?


*请记住,我无法更改任何结构的结构。


慕仙森
浏览 102回答 1
1回答

森栏

ItemUnit首先,为where itemUnit.ItemCodeas key 和 slice of UnitNameas value创建一个映射    itemUnitmap := make(map[string][]string)    for _, itemUnit := range itemUnits {        var units []string        for _, unit := range itemUnit.Units {            units =  append(units, unit.UnitName)        }        itemUnitmap[itemUnit.ItemCode] = units    }然后使用 map 获取UnitNameusing的切片item.ItemCode。Item.Units使用可变参数函数添加切片   for orderIndex, order := range unload.Orders {        for itemIndex, item := range order.Items {            if units, ok := itemUnitmap[item.ItemCode]; ok {                unload.Orders[orderIndex].Items[itemIndex].Units = append(unload.Orders[orderIndex].Items[itemIndex].Units, units...)// variadic function used to append slice into slice            }        }    }
随时随地看视频慕课网APP

相关分类

Go
我要回答