Sorting 在Golang中,如何按字母顺序对字符串列表排序而不完全忽略大小写?

Sorting 在Golang中,如何按字母顺序对字符串列表排序而不完全忽略大小写?,sorting,go,alphabetical-sort,Sorting,Go,Alphabetical Sort,我希望字符串按字母顺序排序,控制“A”是否在“A”之前 在Less()函数中,使用strings.ToLower()无法实现这一点。有时“A”在“A”之前,有时在“A”之后。而不是使用字符串来比较整个字符串。ToLower,比较单个符文 type ByCase[]字符串 func(s ByCase)Len()int{return Len(s)} func(s ByCase)Swap(i,j int){s[i],s[j]=s[j],s[i]} func(s ByCase)减去(i,j int)b

我希望字符串按字母顺序排序,控制“A”是否在“A”之前


在Less()函数中,使用strings.ToLower()无法实现这一点。有时“A”在“A”之前,有时在“A”之后。

而不是使用
字符串来比较整个字符串。ToLower
,比较单个符文

type ByCase[]字符串
func(s ByCase)Len()int{return Len(s)}
func(s ByCase)Swap(i,j int){s[i],s[j]=s[j],s[i]}
func(s ByCase)减去(i,j int)bool{
iRunes:=[]符文(s[i])
jRunes:=[]符文(s[j])
最大值:=len(iRunes)
如果max>len(jRunes){
max=len(jRunes)
}
对于idx:=0;idx
这可能是一种解决方案:

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])
    }
}

下面是一个使用
字符串的Unicode友好方法。Map

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]
}
主程序包
进口(
“fmt”
“排序”
“字符串”
“unicode”
)
类型slice struct{sort.StringSlice}
func(s切片)减去(d,e int)bool{
t:=strings.Map(unicode.ToUpper,s.StringSlice[d])
u:=strings.Map(unicode.ToUpper,s.StringSlice[e])
返回t

是否希望
“A”
始终位于
“A”
之前?你能给我一些进/出的样品吗?总是可以。例如:A X Y Y Z Z(假设这些都是字符串)。我本来希望有一个标准的按字母顺序排列的字符串函数,但我没有找到。如果比较是
if ir==jr{//compare upper vs lower},或者{return lir
,这可能会更简洁。它使它看起来更像一个特例,而不像是一个全新的逻辑。@AdamSmith:我认为这不太有效(如果它们相等,就没有什么可比的)。我希望这对OP来说是非常明确的,但我想我更喜欢这个简明的逻辑啊,是的,我倒过来了:)
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
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]
}