为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕仙森 2022-05-23 17:32:55
假设有以下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)                }            }        }    }}我自己不是围棋专家,但在我看来,这个解决方案的时间复杂度成本非常高。是否有任何其他更优雅且可能具有更小时间复杂度的方法来解决这个问题?*请记住,我无法更改任何结构的结构。
查看完整描述

1 回答

?
森栏

TA贡献1810条经验 获得超5个赞

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

            }

        }

    }


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信