Sorting 高效地对切片列表进行排序

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"

我有一个函数,可以从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"], 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)