我有一部分字符串,其中包含星期几,如下所示:
days := []string{"M", "Th", "W", "F", "T", "S", "Su"}
我如何对它们进行排序,使其输出如下:
[M T W Th F S Su]
从星期一开始。
最佳答案
您可以创建一个映射其相对日期的关键日期。然后,您可以使用类型实现sort.Interface
接口(interface):
type Days []string
// map to store weekdays' relative order
var days = map[string]int{
"M": 1,
"T": 2,
"W": 3,
"Th": 4,
"F": 5,
"S": 6,
"Su": 7,
}
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 days[d[i]] < days[d[j]]
}
func main() {
ds := Days([]string{"M", "Th", "W", "F", "T", "S", "Su"})
sort.Sort(ds)
fmt.Println(ds)
}
示例:https://play.golang.org/p/lzdfI-1BJK
如果需要,可以将
days
移到Less
方法中以避免全局变量。但这将是非常低效的,因为将为Days
的每个元素初始化映射。另一种实现方式是使用日期正确顺序的预声明 slice ,然后在
strings.Index
中使用Less
。这会执行得较慢,但是由于您的 slice 长度固定且非常小(只有7个元素),所以这不是什么大问题。关于sorting - Golang : How to sort slices by days of the week?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38581277/