在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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |