登录
首页 >  Golang >  Go问答

在Go中将结构与子切片映射时如何降低时间复杂度?

来源:stackoverflow

时间:2024-04-14 14:48:35 242浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个Golang开发实战,手把手教大家学习《在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
}

我们需要根据两侧相似的 itemcodes 值,使用相应的 unitname 值填充 itemunits 切片。

我设法提出以下解决方案来解决此问题:

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)
                }
            }
        }
    }
}

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

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


解决方案


首先,为 itemunit 创建一个映射,其中 itemunit.itemcode 作为键,unitname 的切片作为值

    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使用item.itemcode获取unitname的切片。使用可变参数函数将切片添加到 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
            }
        }
    }

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>