gpt4 book ai didi

sorting - Golang Sort 为 map 添加额外的值

转载 作者:IT王子 更新时间:2023-10-29 02:29:55 26 4
gpt4 key购买 nike

type GeoNameTally struct {
Id uint32
Count uint32
}

type Tally map[uint32]GeoNameTally

以上是我拥有的结构。这个想法很简单。我只是统计某事发生了多少次。

func (t Tally) Len() int           { return len(t) }
func (t Tally) Less(i, j int) bool { return t[uint32(i)].Count < t[uint32(j)].Count }
func (t Tally) Swap(i, j int) { t[uint32(i)], t[uint32(j)] = t[uint32(j)], t[uint32(i)] }

在我进行排序之前,一切正常。就在排序之前, map 看起来不错:

map[1043487:{Id:1043487 Count:1} 1043503:{Id:1043503 Count:1} 1043444:{Id:1043444 Count:1} 1043491:{Id:1043491 Count:1} 1043459:{Id:1043459 Count:1} 1043475:{Id:1043475 Count:1} 1043464:{Id:1043464 Count:1} 1043441:{Id:1043441 Count:1} 1043470:{Id:1043470 Count:1} 1043460:{Id:1043460 Count:1}]

但是在 sort.Sort(myTally) 之后, map 有额外的空值,您可以从以下输出中看到:

map[1043503:{Id:1043503 Count:1} 1043491:{Id:1043491 Count:1} 1043459:{Id:1043459 Count:1} 1043475:{Id:1043475 Count:1} 4:{Id:0 Count:0} 8:{Id:0 Count:0} 1043487:{Id:1043487 Count:1} 1:{Id:0 Count:0} 5:{Id:0 Count:0} 9:{Id:0 Count:0} 1043470:{Id:1043470 Count:1} 2:{Id:0 Count:0} 6:{Id:0 Count:0} 1043444:{Id:1043444 Count:1} 1043441:{Id:1043441 Count:1} 1043460:{Id:1043460 Count:1} 3:{Id:0 Count:0} 7:{Id:0 Count:0} 1043464:{Id:1043464 Count:1}]

我是不是对这 3 个功能做错了什么?

最佳答案

您将不存在的索引传递给 Swap(i, j)

map 类型是复合的。它根据另外两种类型定义:键类型和值类型。示例:

map[string]bool

在前面的例子中,string是键类型,bool是值类型。

您可能知道, map 访问会返回 1 或 2 个值。在像您这样的 1 返回值上下文中,当给定不存在的索引时, map 访问将返回 map 值类型的零值。

这意味着,如果您访问 m["im_not_defined"] 某些类型为 map[string]bool 的 map m,您会得到一个返回值 zero-value对于 bool( map 的值类型)。

您可以检查索引是否已定义(在 Swap 内部):

if a, k := t[uint32(i)]; k {
t[uint32(j)] = a
} else {
panic("undefined index")
}

对于 j 也是类似的。

所以基本上,如果 i 未定义,GeoNameTally 的零值将分配给 t[j],这会导致您的“空”(零)值。

无论如何,如果你想对任何东西进行排序,你将不得不使用 slice 。根据定义, map 是无序的。

关于sorting - Golang Sort 为 map 添加额外的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33680134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com