使用地图中的值进行地图搜索

时间:2017-07-24 00:03:31

标签: go maps

我有一个像map [string] [] string的结构图。现在我必须找到在值切片中具有所需值的所有键。我可以这样做:

// allsvc is map[string][]string
var newsl []string


    for k, v :=  range  allsvc {
        for _, val := range v {
            if v == "type1" || v == "type2" {
                newsl.append(k)
            }
        }

    }

地图allsvc在任何给定时间至少有五十万个条目,并且查找非常频繁。我将allsvc地图作为第三方库的输出,然后我必须使用我的api中的值进行搜索并提供响应。鉴于查找的频率很高,不使用键但是使用值,我这样做的方式使我的api响应时间在几秒钟内。有没有办法提高性能(查找速度)?

1 个答案:

答案 0 :(得分:2)

如果您要多次查询该地图,可能需要花一些时间重新安排它,以便您可以更快地查询它。

似乎你需要反转关系,使allsvc中的值成为新地图中的键,并将键作为值,这样你就可以在新地图中进行查找。

这可以是重新安排地图的方法:

func arrangeMap(oldMap map[string][]string) map[string][]string {
    newMap := make(map[string][]string)
    for k, v :=  range  oldMap {
        for _, val := range v {
            newMap[val] = append(newMap[val], k)
        }
    }
    return newMap
}

在这里看到一个展示这个想法的游乐场:

https://play.golang.org/p/0ThZlX9xUn