在Golang中,如何在不完全忽略大小写的情况下按字母顺序对字符串列表进行排序?

时间:2016-01-29 02:57:13

标签: sorting go alphabetical-sort

我希望字符串按字母顺序排序,并控制是否" A"来之前" a"。

在使用strings.ToLower()的Less()函数中没有实现这一点。有时" A"来之前" a",有时候之后。

3 个答案:

答案 0 :(得分:4)

而不是使用1 (TRUE) 比较整个字符串,比较各个符文。

http://play.golang.org/p/twDrCxdYoi

strings.ToLower

答案 1 :(得分:2)

这可能是一个解决方案:

package main

import (
    "strings"
    "sort"
    "fmt"
)

var listOfStrings []string = []string{
    "mars bar",
    "milk-duds",
    "Mars bar",
    "milk",
    "milky-way",
    "Milk",
    "Milky-way",
    "mars",
}

type Alphabetic []string

func (list Alphabetic) Len() int { return len(list) }

func (list Alphabetic) Swap(i, j int) { list[i], list[j] = list[j], list[i] }

func (list Alphabetic) Less(i, j int) bool {
    var si string = list[i]
    var sj string = list[j]
    var si_lower = strings.ToLower(si)
    var sj_lower = strings.ToLower(sj)
    if si_lower == sj_lower {
        return si < sj
    }
    return si_lower < sj_lower
}

func main() {
    fmt.Println("UNSORTED")
    printStrings(listOfStrings)
    sort.Sort(Alphabetic(listOfStrings))
    fmt.Println()
    fmt.Println("SORTED ALPHABETICALLY")
    printStrings(listOfStrings)
}

func printStrings(slice []string) {
    for i := 0; i < len(slice); i++ {
        fmt.Println(slice[i])
    }
}

这是输出:

UNSORTED
mars bar
milk-duds
Mars bar
milk
milky-way
Milk
Milky-way
mars

SORTED ALPHABETICALLY
mars
Mars bar
mars bar
Milk
milk
milk-duds
Milky-way
milky-way

答案 2 :(得分:0)

这是一个使用 strings.Map 的 Unicode 友好方法:

package main

import (
   "fmt"
   "sort"
   "strings"
   "unicode"
)

type slice struct { sort.StringSlice }

func (s slice) Less(d, e int) bool {
   t := strings.Map(unicode.ToUpper, s.StringSlice[d])
   u := strings.Map(unicode.ToUpper, s.StringSlice[e])
   return t < u
}

func main() {
   a := slice{
      sort.StringSlice{"a", "b", "A", "B"},
   }
   sort.Sort(a)
   fmt.Println(a.StringSlice) // [a A b B]
}

https://golang.org/pkg/strings#Map