为了账号安全,请及时绑定邮箱和手机立即绑定

有效地对切片列表进行排序

有效地对切片列表进行排序

Go
呼唤远方 2022-07-18 15:45:28
我有一个函数可以从 map[string] 字符串中复制数据并从中进行切片。功能如下:type Tags map[string]stringfunc 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 之间),我应该使用哪种类型的排序?
查看完整描述

3 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

您最好的调用是IDs在从函数返回之前对切片进行排序。正如cn007b指出的那样,只需使用排序库即可

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


查看完整回答
反对 回复 2022-07-18
?
绝地无双

TA贡献1946条经验 获得超4个赞

在你的情况下,strconv.ParseUint你有价值uint64,所以最好有切片,[]uint64而不是[]interface{}因为它更容易排序。

所以你可以做这样的事情:


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

}

如果您仍然需要[]interface{},您可以执行以下操作:


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类型。

因为这个关于排序的问题,我没有改变任何其他东西,但是有改进的余地(循环,返回类型,......),这超出了这个问题的范围。


查看完整回答
反对 回复 2022-07-18
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

看看这篇文章https://golang.org/pkg/sort/。基于键排序的示例听起来是您尝试对切片执行的操作。然后调用排序的键类型,您将拥有由 Sort() 调用的 Less、Swap 和 Len 函数。这允许您按特定键排序。



查看完整回答
反对 回复 2022-07-18
  • 3 回答
  • 0 关注
  • 291 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号