Sorting 高效地对切片列表进行排序
我有一个函数,可以从map[string]string复制数据并从中生成一个切片。功能如下:Sorting 高效地对切片列表进行排序,sorting,go,Sorting,Go,我有一个函数,可以从map[string]string复制数据并从中生成一个切片。功能如下: type Tags map[string]string func createtraffic(tags []Tags) []interface{} { IDs := make([]interface{}, len(tags)) for i := range tags { id, err := strconv.ParseUint(tags[i]["id"
type Tags map[string]string
func createtraffic(tags []Tags) []interface{} {
IDs := make([]interface{}, len(tags))
for i := range tags {
id, err := strconv.ParseUint(tags[i]["id"], 10, 64)
if err != nil {
continue
}
IDs[i] = id
}
return IDs
}
现在我想按“id”的递增顺序对id进行排序
我不确定我是否应该在这个for循环之后对它进行排序,或者因为我已经在地图上循环了,所以我应该在这个循环中进行排序。
我应该选择哪一种(地图的长度在10K-20K之间)以及我应该使用哪种类型的排序?看看这篇文章。基于关键点排序的示例听起来就是您试图对切片执行的操作。然后调用sort的键类型,就有了由sort()调用的Less、Swap和Len函数。这允许您按特定键进行排序。在
strconv.ParseUint
之后,您有值uint64
,因此最好使用slice[]uint64
而不是[]接口{}
,因为这样更容易排序。
所以你可以这样做:
func createtraffic(tags []Tags) interface{} {
IDs := make([]uint64, len(tags))
for i := range tags {
id, err := strconv.ParseUint(tags[i]["id"], 10, 64)
if err != nil {
continue
}
IDs[i] = id
}
sort.Slice(IDs, func(i, j int) bool { return IDs[i] < IDs[j] })
return IDs
}
func createtraffic(tags []Tags) []interface{} {
IDs := make([]interface{}, len(tags))
for i := range tags {
id, err := strconv.ParseUint(tags[i]["id"], 10, 64)
if err != nil {
continue
}
IDs[i] = id
}
sort.Slice(IDs, func(i, j int) bool { return IDs[i].(uint64) < IDs[j].(uint64) })
return IDs
}
PS:这里我刚刚添加了sort.Slice
并更新了IDs
类型。
由于这个关于排序的问题,我没有改变任何其他内容,但是还有改进的余地(循环、返回类型等等),这些都超出了这个问题的范围。您最好的方法是在从函数返回之前对ID进行排序。如前所述,只需使用排序库即可
sort.Slice(IDs,func(i,j int)bool{returnids[i](uint64)
只需使用排序。字符串
过早优化是万恶之源。只要做一个普通的排序.Slice
,如果这还不能满足您的需要,那么就对其他方法进行基准测试。谢谢,但我希望返回类型是interface{}。这里的返回类型是[]uint64I使用id的数据类型作为id:=make([]接口{},len(标记)),并将排序函数更改为sort.Slice(tagIDs,func(i,j int)bool{return tagIDs[i](int64)