加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在golang中使用变长数组作为映射键

发布时间:2020-12-16 09:23:47 所属栏目:大数据 来源:网络整理
导读:我找不到一个很好的方法来做到这一点.我想从排序的键值对列表中获得一个映射. type Tag struct { key string value string}type SortedTag []Tag // sorted list of tags.map[SortedTags]T // cannot do. 我可以通过使用分隔符连接所有键值对来解决这个问题,
我找不到一个很好的方法来做到这一点.我想从排序的键值对列表中获得一个映射.

type Tag struct {
  key   string
  value string
}

type SortedTag []Tag // sorted list of tags.
map[SortedTags]T // cannot do.

我可以通过使用分隔符连接所有键值对来解决这个问题,但我觉得这在很多方面都是低效且容易出错的.转换回键值对很麻烦,因为我们需要拆分输入.而且,如果键值对可以是任何东西,那意味着我们必须逃避它.

如果它是python,我会将Tag存储为排序2-tupless的N-tuple.

如果是java,我会用Map< String,String>创建一个复合对象.使用equals()检查其他散列映射,hashCode()返回映射的所有散列的xor(xor,因为它是可交换的,因此我们可以按任何顺序迭代映射来计算此值).

在去,我想不出任何其他好方法.

解决方法

例如,

package main

import "fmt"

type Tag struct {
    Key   string
    Value string
}

type Tags []Tag

type TagsValue struct {
    // some type used as Tags value
}

type TagsMapValue struct {
    Tags
    TagsValue
}

type TagsMapKey string

type TagsMap map[TagsMapKey]TagsMapValue

func NewTagsMapKey(tags Tags) TagsMapKey {
    b := []byte{}
    for _,tag := range tags {
        b = append(b,tag.Key...)
        b = append(b,tag.Value...)
    }
    return TagsMapKey(b[:len(b)])
}

func (m *TagsMap) AddElement(tags Tags,tagsValue TagsValue) {
    mapKey := NewTagsMapKey(tags)
    mapValue := TagsMapValue{Tags: make(Tags,len(tags)),TagsValue: tagsValue}
    i := 0
    for _,tag := range tags {
        key := string(mapKey[i : i+len(tag.Key)])
        i += len(tag.Key)
        value := string(mapKey[i : i+len(tag.Value)])
        i += len(tag.Value)
        mapValue.Tags = append(mapValue.Tags,Tag{Key: key,Value: value})
    }
    (*m)[mapKey] = mapValue
    return
}

func main() {
    m := make(TagsMap)
    sortedTags := Tags{
        {Key: "key1",Value: "value1"},{Key: "key7",Value: "value7"},Value: "value49"},{Key: "key42",Value: "value42"},}
    m.AddElement(sortedTags,TagsValue{})
    for k,v := range m {
        fmt.Println("Tags Key:",k)
        fmt.Println("   Tags:      ",v.Tags)
        fmt.Println("   Tags Value:",v.TagsValue)
    }
}

输出:

Tags Key: key1value1key7value7key7value49key42value42
   Tags:       [{key1 value1} {key7 value7} {key7 value49} {key42 value42}]
   Tags Value: {}

如果您只是尝试测试标签集成员资格,

package main

import "fmt"

type Tag struct {
    Key   string
    Value string
}

type Tags []Tag

type TagsSetKey string

type TagsSet map[TagsSetKey]Tags

func NewTagsSetKey(tags Tags) TagsSetKey {
    b := []byte{}
    for _,tag.Value...)
    }
    return TagsSetKey(b[:len(b)])
}

func (m *TagsSet) AddElement(tags Tags) {
    setKey := NewTagsSetKey(tags)
    setValue := make(Tags,len(tags))
    i := 0
    for _,tag := range tags {
        key := string(setKey[i : i+len(tag.Key)])
        i += len(tag.Key)
        value := string(setKey[i : i+len(tag.Value)])
        i += len(tag.Value)
        setValue = append(setValue,Value: value})
    }
    (*m)[setKey] = setValue
    return
}

func (m *TagsSet) IsMember(tags Tags) bool {
    return (*m)[NewTagsSetKey(tags)] != nil
}

func main() {
    m := make(TagsSet)
    sortedTags := Tags{
        {Key: "key1",}
    m.AddElement(sortedTags)
    for k,k)
        fmt.Println("   Tags: ",v)
    }
    // In set
    fmt.Println(m.IsMember(sortedTags))
    // Not in set
    sortedTags[0].Key = "key0"
    fmt.Println(m.IsMember(sortedTags))
}

输出:

Tags Key: key1value1key7value7key7value49key42value42
   Tags:  [{key1 value1} {key7 value7} {key7 value49} {key42 value42}]
true
false

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读