本文介绍在 Go 中将包含缩写星期名(如 "M"、"T"、"W" 等)的字符串切片,按周一到周日的自然顺序高效排序的方法,核心是自定义 sort.Interface 并借助映射表定义优先级。
本文介绍在 go 中将包含缩写星期名(如 "m"、"t"、"w" 等)的字符串切片,按周一到周日的自然顺序高效排序的方法,核心是自定义 `sort.interface` 并借助映射表定义优先级。
在 Go 中,标准库的 sort 包不提供内置的“按自定义顺序排序”能力,因此需通过实现 sort.Interface 接口(即 Len()、Less() 和 Swap() 方法)来定义排序逻辑。针对星期几这种有明确语义顺序但非字典序的数据,最清晰、高效的方式是预先建立一个星期缩写到序号的映射表(map),再在 Less 方法中依据该序号比较元素。
以下是一个完整、可直接运行的示例:
package mainimport ( "fmt" "sort")type Days []string// weekdayOrder 定义星期缩写到序号的映射(1=Monday, 7=Sunday)var weekdayOrder = map[string]int{ "M": 1, // Monday "T": 2, // Tuesday "W": 3, // Wednesday "Th": 4, // Thursday "F": 5, // Friday "S": 6, // Saturday "Su": 7, // Sunday}func (d Days) Len() int { return len(d) }func (d Days) Swap(i, j int) { d[i], d[j] = d[j], d[i] }func (d Days) Less(i, j int) bool { return weekdayOrder[d[i]] < weekdayOrder[d[j]] }func main() { days := Days{"M", "Th", "W", "F", "T", "S", "Su"} sort.Sort(days) fmt.Println(days) // 输出:[M T W Th F S Su]}
✅ 关键说明与最佳实践:
综上,使用带语义映射的自定义 sort.Interface 是 Go 中处理此类有序枚举排序的推荐模式——它兼具效率、可读性与扩展性。