按升序排序“d.mm”和“dd.mm”日期

时间:2018-04-23 11:22:09

标签: algorithm go

我有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数字,因为我认为使用数字更容易(参见注释),但似乎最糟糕。

我怎样才能做到这一点?

3 个答案:

答案 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]