我有var keys []string
。键表示格式为"D.MM"
或"DD.MM"
的日期和月份。
例如:
1.02 (1st of February) - 2.02 (2nd of February) - 1.03 (1st of March) - 3.02 (3rd of February) - 31.12 (31st of December)
我需要按如下方式对键进行排序:
[ '1.02', '2.02', '3.02', '1.03', '31.12' ]
。
首先是月份,然后是几个月内的日子。
我首先尝试将字符串解析为float64数字,因为我认为使用数字更容易(参见注释),但似乎最糟糕。
我怎样才能做到这一点?
答案 0 :(得分:2)
你需要使用比较器函数(据我所知 - go
提供such possibility)将字符串分成两部分,比较第二部分,如果相等则比较第一部分。<登记/>
要提供正确的天数比较,请将字符串值转换为整数,或者只是添加&#39; 0&#39;在字符串长度为1的情况下(要使&#39; 21&#39;&#39;&#39; 7&#39;)
伪代码:
sort list with comparator func(a, b: string):
a => lefta, righta
b => leftb, rightb
if righta > rightb
return 1
else if righta < rightb
return -1
else:
if length(lefta)=1
lefta = '0' + lefta
if length(leftb)=1
leftb = '0' + leftb
if lefta > leftb
return 1
else if lefta < leftb
return -1
else
return 0
答案 1 :(得分:2)
我想你需要一个Go程序。检查this one:
package main
import (
"fmt"
"sort"
"strings"
)
type ByDay struct { sort.StringSlice }
func (a ByDay) Less(i, j int) bool {
dmi, dmj := strings.Split(a.StringSlice[i], "."), strings.Split(a.StringSlice[j], ".")
return dmi[1] < dmj[1] || dmi[1] == dmj[1] && dmi[0] < dmj[0]
}
func main() {
days := []string{"3.03", "3.02", "2.02", "3.01", "1.03", "1.02"}
sort.Sort(ByDay{days})
fmt.Println(days)
}
打印[3.01 1.02 2.02 3.02 1.03 3.03]
。
我怀疑ByDay
是最好的名字,你最好给它一个更具描述性的名字。
答案 2 :(得分:2)
例如,有效的转换和比较,
package main
import (
"fmt"
"sort"
)
func mmdd(key string) uint32 {
// "d.mm" or "dd.mm"
k := uint32(key[len(key)-1])<<16 +
uint32(key[len(key)-2])<<24 +
uint32(key[len(key)-4])<<0
if len(key) >= 5 {
k += uint32(key[len(key)-5]) << 8
}
return k
}
func main() {
// 1.02 (1st of February); 2.02 (2nd of February); 1.03 (1st of March); 3.02 (3rd of February)
keys := []string{"31.12", "01.01", "1.02", "2.02", "1.03", "3.02", "30.11"}
fmt.Println(keys)
sort.Slice(keys,
func(i, j int) bool {
return mmdd(keys[i]) < mmdd(keys[j])
},
)
fmt.Println(keys)
}
输出:
[31.12 01.01 1.02 2.02 1.03 3.02 30.11]
[01.01 1.02 2.02 3.02 1.03 30.11 31.12]