Sorting 在Golang中,如何按字母顺序对字符串列表排序而不完全忽略大小写?
我希望字符串按字母顺序排序,控制“A”是否在“A”之前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
在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]
}