按值出现的次数对切片进行排序

时间:2018-11-26 20:26:58

标签: sorting go slice

请参阅this playground。我有一些数据。现在,我想对该切片进行排序,但不对其中一个值内的值进行排序,而是对其中一个值的出现次数进行排序。

不幸的是,我不知道如何解决此问题。有人可以指出我正确的方向吗?

我知道我可以做到:

sort.Slice(messages, func(i, j int) bool {
    return messages[i].SupplierID < messages[j].SupplierID
})

这将对切片进行排序,但是它将以“最大”供应商ID开头。但是我想要的是对出现的次数进行排序:首先是具有提供商ID租约数量的那些。

1 个答案:

答案 0 :(得分:4)

遍历切片,填充出现次数的地图,然后根据出现次数对切片进行排序:

supplierCounts := make(map[int]int)
for _, msg := range messages {
    supplierCounts[msg.SupplierID]++
}

sort.Slice(messages, func(i, j int) bool {
    return supplierCounts[messages[i].SupplierID] < supplierCounts[messages[j].SupplierID]
})

https://play.golang.org/p/YMWPP2JBC2P