package main
import (
"fmt"
"sort"
_ "sort"
)
type infoItem struct {
Date string `tag:"0" required:"false" json:"date"`
ID int64 `tag:"1" required:"false" json:"ID"`
Score int64 `tag:"2" required:"false" json:"Score"`
}
type infoList struct {
List []infoItem `tag:"0" required:"false" json:"list"`
}
// 获取第一名
func getRankIDCntMax(info *infoList) (int64, int32) {
if len(info.List) == 0 {
return 0, 0
}
type InfoTmp struct {
ID int64 // 根据ID做词频统计
IDCnt int64 // ID出现次数
score int64 // 总得分
}
ID2InfoTmpMap := make(map[int64]*InfoTmp)
// 按照ID,统计次数,保存到ID2InfoTmpMap
for _, item := range info.List {
if item.ID <= 0 { // 过滤掉不符合要求的ID
continue
}
if _, ok := ID2InfoTmpMap[item.ID]; !ok {
ID2InfoTmpMap[item.ID] = &InfoTmp{}
}
ID2InfoTmpMap[item.ID].ID = item.ID
ID2InfoTmpMap[item.ID].IDCnt++
ID2InfoTmpMap[item.ID].score += item.Score
}
if len(ID2InfoTmpMap) == 0 {
return 0, 0
}
// map --> slice 排序: 按照IDCnt、socre、Uin排序
var InfoTmpVec []InfoTmp
for _, v := range ID2InfoTmpMap {
InfoTmpVec = append(InfoTmpVec, *v)
}
sort.SliceStable(InfoTmpVec, func(i, j int) bool {
if InfoTmpVec[i].IDCnt > InfoTmpVec[j].IDCnt { // 总次数
return true
} else if InfoTmpVec[i].IDCnt == InfoTmpVec[j].IDCnt && InfoTmpVec[i].score > InfoTmpVec[j].score { // 分数
return true
} else if InfoTmpVec[i].IDCnt == InfoTmpVec[j].IDCnt && InfoTmpVec[i].score == InfoTmpVec[j].score && InfoTmpVec[i].ID > InfoTmpVec[j].ID { // ID
return true
} else {
return false
}
})
fmt.Println(InfoTmpVec)
// 返回出现次数最多的ID
return InfoTmpVec[0].ID, int32(InfoTmpVec[0].IDCnt)
}
func main() {
var list = []infoItem{
infoItem{ID:10,Score: 3},
infoItem{ID:12,Score: 1},
infoItem{ID:12,Score: 1},
infoItem{ID:13,Score: 1},
infoItem{ID:13,Score: 1},
}
info := infoList{
List:list,
}
fmt.Println(getRankIDCntMax(&info))
}
[{13 2 2} {12 2 2} {10 1 3}]
13 2
词频统计、排序
最新推荐文章于 2022-02-14 00:57:36 发布
该代码段展示了一个使用Go语言实现的功能,从infoList结构体中找出列表中具有最高ID计数及其对应的得分。首先,通过遍历列表统计每个ID的出现次数和总得分,然后将数据存储在map中。接着,将map转换为切片并进行排序,最后返回出现次数最多且得分最高的ID及其计数。
摘要由CSDN通过智能技术生成