猿问

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

我使用 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])

   }

}

但我认为这是一种非常低效的方式。那么,还有其他方法吗?


拉莫斯之舞
浏览 116回答 1
1回答

慕尼黑8549860

使用 MySQLORDER BY FIELD(id,'b','c','a')是高效的,如果您不介意扩展查询并在查询中包含您的逻辑,那么它没有任何问题。如果你想在 Go 中这样做:Go 的标准库提供了一个sort.Slice()对任何切片进行排序的函数。您必须向它传递一个less()函数,该函数必须告诉切片中的 2 个元素如何相互关联,如果一个小于另一个。你想要一个由另一个排序的keys切片指定的顺序。因此,基本上要判断一个学生是否比另一个学生“少”,您需要比较他们的键的索引。为了避免每次都对键切片进行线性搜索,您应该构建它们的映射:m := map[string]int{}for i, k := range keys {&nbsp; &nbsp; m[k] = i}因此,作为“less”逻辑基础的索引是一个简单的地图查找:sort.Slice(students, func(i, j int) bool {&nbsp; &nbsp; return m[students[i].ID] < m[students[j].ID]})在Go Playground上试试这个。
随时随地看视频慕课网APP

相关分类

Go
我要回答