我有一部分字符串,其中包含星期几,如下所示:

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/

10-12 07:37