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]) &lt; 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 中如何使用切片进行复制? [关闭]

Golang:map的定义操作排序以及map切片

Golang basic_leaming切片排序算法以及 sort 包

Golang basic_leaming切片排序算法以及 sort 包

Golang:map的定义操作排序以及map切片

Golang:map的定义操作排序以及map切片