栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Golang:对结构进行分组和求和

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Golang:对结构进行分组和求和

基本上,您的

idXX
字段是键,一个n元组。而
money
场要加总的数据。

如果您稍微重构类型,则可以轻松完成此操作。仅将键放入结构中,因此可以将其用作地图中的键。结构值是可比较的:

如果结构的所有字段都是可比较的,则它们的值是可比较的。如果两个结构值对应的非空白字段相等,则它们相等。

因此,新类型为:

type Key struct {    id1 int    id2 int    id3 int    id4 int    id5 int    id6 int    id7 int    id8 int}type Register struct {    key   Key    money int}

要对和进行分组和计算总和,您可以使用

map[Key]int
Register.key
作为映射键来对所有具有相同键(相同ID)的寄存器进行“分组”:

regs := []*Register{    {Key{id1: 345}, 1500},    {Key{id1: 345, id2: 140}, 2700},    {Key{id1: 345, id2: 140}, 1300},    {Key{id1: 345}, 1000},    {Key{id3: 999}, 1000},    {Key{id3: 999}, 2000},}// calculate sum:m := map[Key]int{}for _, v := range regs {    m[v.key] += v.money}fmt.Println(m)

输出:

map[{345 0 0 0 0 0 0 0}:2500 {345 140 0 0 0 0 0 0}:4000 {0 0 999 0 0 0 0 0}:3000]

对于一个不错的输出:

fmt.Println("Nice output:")for k, v := range m {    fmt.Printf("%+3v: %dn", k, v)}

输出:

Nice output:{id1:345 id2:  0 id3:  0 id4:  0 id5:  0 id6:  0 id7:  0 id8:  0}: 2500{id1:345 id2:140 id3:  0 id4:  0 id5:  0 id6:  0 id7:  0 id8:  0}: 4000{id1:  0 id2:  0 id3:999 id4:  0 id5:  0 id6:  0 id7:  0 id8:  0}: 3000

这是一样容易和有效的。在Go Playground上尝试示例。

笔记:

在地图中,我们不必检查其中

Key
是否已存在a
。之所以如此,是因为如果键不在映射中,则索引映射会产生映射值类型的零值。因此,在这种情况下,如果a
Key
尚未在映射中,
m[key]
则会给您
0
0
int
类型的零值),并正确告知该键的“上一个”和是
0
到目前为止。

还要注意,

Key
可能是一个嵌入式领域中
Register
,而不是一个“正规”的领域,它并不重要,而这种方式,你可以参考
idXX
场,如果他们的一部分
Register



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/495505.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号