我的程序地图如下所示:

fruit_map := map[string]string {
    "apple": "likey",
    "orange": "no likey",
}

我想反转它,以便它读取以下内容:

{
    "likey": "apple",
    "no likey": "orange",
}

值中没有重复项。 此外,我的地图很小 - 约200键。 我没有找到任何内置方法来反转像这样的地图。 有没有办法快速做到这一点? 我对空间复杂性并不感到困扰,但解决方案需要快速。

谢谢。

===============>>#1 票数:4 已采纳

您可以编写for循环来迭代原始地图的键值对,并将它们放入新地图中(请参阅函数reverseMap

代码@ http://play.golang.org/p/mCFmRT8nzP

package main

import (
    "fmt"
)

func main() {
    fruit_map := map[string]string{
        "apple":  "likey",
        "orange": "no likey",
    }

    reversedMap := reverseMap(fruit_map)
    fmt.Println(reversedMap)
}

func reverseMap(m map[string]string) map[string]string {
    n := make(map[string]string)
    for k, v := range m {
        n[v] = k
    }
    return n
}

输出:

map[likey:apple no likey:orange]

顺便说一句,将变量命名为fruit_map并不是惯用的,你真的应该使用camel-case,比如fruitMap

===============>>#2 票数:3

其他答案提供了基于直接处理地图的简单解决方案。

另一种解决方案是将双向映射封装为独立的实用程序,其优点是您可以为其编写全面的单元测试,然后能够依靠它通过简单的API正确运行。

这是我的示例实现 (它是不完整的,还没有必要的单元测试):

包主

import (
    "fmt"
)

func main() {
    biMap := NewBiMap()
    biMap.Put("apple", "likey")
    biMap.Put("orange", "no likey")
    v, _ := biMap.GetByValue("no likey")
    fmt.Println(v)
}

type BiMap struct {
    ab map[string]string
    ba map[string]string
}

func NewBiMap() *BiMap {
    return &BiMap{make(map[string]string), make(map[string]string)}
}

func (m *BiMap) Put(key, value string) *BiMap {
    m.ab[key] = value
    m.ba[value] = key
    return m
}

func (m *BiMap) GetByKey(key string) (value string, exists bool) {
    value, exists = m.ab[key]
    return
}

func (m *BiMap) GetByValue(value string) (key string, exists bool) {
    key, exists = m.ba[value]
    return
}

func (m *BiMap) Len() int {
    return len(m.ab)
}

func (m *BiMap) DeleteKey(key string) *BiMap {
    value, exists := m.ab[key]
    if exists {
        delete(m.ab, key)
        delete(m.ba, value)
    }
    return m
}

func (m *BiMap) DeleteValue(value string) *BiMap {
    key, exists := m.ba[value]
    if exists {
        delete(m.ab, key)
        delete(m.ba, value)
    }
    return m
}

===============>>#3 票数:0

你是对的,没有任何内置功能可以实现这一点,但它非常简单:

package main

import "fmt"

func main() {

    fruit_map := map[string]string{
        "apple":  "likey",
        "orange": "no likey",
    }

    //create your new empty map that will hold your reversed contents.
    reversed_fruit_map := make(map[string]string)

    for k, v := range fruit_map{
        reversed_fruit_map[v] = k
    }

    fmt.Println(reversed_fruit_map)
}

这输出如下:

map[likey:apple no likey:orange]

操场上看看。 如果这很常见,您可以随时提取到您自己的功能中。

===============>>#4 票数:0

没有内置函数可以做到这一点,但是使用for循环很简单。

fruit_map := map[string]string {
    "apple": "likey",
    "orange": "no likey",
}

reversed_map := make(map[string]string)

for key,value := range fruit_map {
    reversed_map[value] = key
}

见: http//play.golang.org/p/BQjqUsf9aU

  ask by jyotiska translate from so

未解决问题?本站智能推荐: