Golang按名称排序切片[关闭]
Posted
技术标签:
【中文标题】Golang按名称排序切片[关闭]【英文标题】:Golang sorting slices by name [closed] 【发布时间】: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])
来自代码来自 (***.com/a/51997951) 的答案的 Go Playground 示例仅使用第一个索引,因为该问题的 OP 只有一个字符的字符串。
为了获得更好的性能,请在每次比较期间考虑使用case-insensitive compare 而不是strings.ToLower
。
【参考方案1】:
[更新]:正如@colm.anseo 在 cmets 中所说,我修补了函数以进行不区分大小写的排序。
错误在于Less
方法的实现。您只是在评估字符串的第一个字符(转换为 rune
的一部分,然后取第一个字母)。将方法的实现改成这样:
func (s byLength) Less(i, j int) bool
return strings.ToLower(s[i]) < strings.ToLower(s[j])
【讨论】:
以上是关于Golang按名称排序切片[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Golang basic_leaming切片排序算法以及 sort 包