【发布时间】:2022-01-22 02:33:41
【问题描述】:
我有一个结构切片,其属性为name,类型为string,我需要按结构名称的字母顺序对切片进行排序,并且不区分大小写。
Bellow 是每个示例给出的代码,它们在其中对一段字符串进行排序,女巫对我有用,但问题是这段代码只考虑了字符串的第一个字母。因此,如果您尝试将代码打印出来,Ab 将放在 Aa 之前,我希望代码考虑到字符串的每个字母,而不仅仅是第一个。
有没有人遇到过这种情况,也许你有解决办法?谢谢。
package main
import (
"fmt"
"sort"
"strings"
)
type byLength []string
func (s byLength) Len() int {
return len(s)
}
func (s byLength) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
func (s byLength) Less(i, j int) bool {
return []rune(strings.ToLower(s[i]))[0] < []rune(strings.ToLower(s[j]))[0]
}
func main() {
data := []string{"Ab", "Aa", "D", "c"}
sort.Sort(byLength(data))
fmt.Println(data)
}
【问题讨论】:
-
然后比较字符串,而不仅仅是第一个符文:
strings.ToLower(s[i]) < strings.ToLower(s[j]) -
来自代码来自 (stackoverflow.com/a/51997951) 的答案的 Go Playground 示例仅使用第一个索引,因为该问题的 OP 只有一个字符的字符串。
-
为了获得更好的性能,请在每次比较期间考虑使用case-insensitive compare 而不是
strings.ToLower。