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

根据切片中的键序列对数据进行排序 Go

根据切片中的键序列对数据进行排序 Go

Go
拉莫斯之舞 2022-05-18 14:34:23
我使用 Go 和 MySQL 数据库。假设我有一段这样的字符串:[]string{"b", "c", "a"}并且我想要这样的最终数据:[]Student{    Student{ID: "b", Name: "Ben"},    Student{ID: "c", Name: "Carl"},    Student{ID: "a", Name: "Alexander"},}当我想建立 MySQL 查询时,是使用ORDER BY FIELD(id,'b','c','a')一种高效的方式吗?或者如果我不使用它,我会有这样的代码:keys := []string{"b", "c", "a"}...students := make([]Student, 0)for rows.Next() {    s := Student{}    err := rows.Scan(&s.ID, &s.Name)    if err != nil {        log.Fatal(err)    }    students = append(students, s)}mStudents := make(map[string]Student, 0)for _, v := range students {    mStudents[v.ID] = v}finalData := make([]Student, 0)for _, v := range keys {   if _, ok := mStudents[v]; ok {       finalData = append(finalData, mStudents[v])   }}但我认为这是一种非常低效的方式。那么,还有其他方法吗?
查看完整描述

1 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

使用 MySQLORDER BY FIELD(id,'b','c','a')是高效的,如果您不介意扩展查询并在查询中包含您的逻辑,那么它没有任何问题。


如果你想在 Go 中这样做:Go 的标准库提供了一个sort.Slice()对任何切片进行排序的函数。您必须向它传递一个less()函数,该函数必须告诉切片中的 2 个元素如何相互关联,如果一个小于另一个。


你想要一个由另一个排序的keys切片指定的顺序。因此,基本上要判断一个学生是否比另一个学生“少”,您需要比较他们的键的索引。


为了避免每次都对键切片进行线性搜索,您应该构建它们的映射:


m := map[string]int{}

for i, k := range keys {

    m[k] = i

}

因此,作为“less”逻辑基础的索引是一个简单的地图查找:


sort.Slice(students, func(i, j int) bool {

    return m[students[i].ID] < m[students[j].ID]

})

在Go Playground上试试这个。


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信