【问题标题】:Golang sorting slices by name [closed]Golang按名称排序切片[关闭]
【发布时间】: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])
  • 来自代码来自 (stackoverflow.com/a/51997951) 的答案的 Go Playground 示例仅使用第一个索引,因为该问题的 OP 只有一个字符的字符串。
  • 为了获得更好的性能,请在每次比较期间考虑使用case-insensitive compare 而不是strings.ToLower

标签: sorting go


【解决方案1】:

[更新]:正如@colm.anseo 在 cmets 中所说,我修补了函数以进行不区分大小写的排序。

错误在于Less 方法的实现。您只是在评估字符串的第一个字符(转换为 rune 的一部分,然后取第一个字母)。将方法的实现改成这样:

func (s byLength) Less(i, j int) bool {
    return strings.ToLower(s[i]) < strings.ToLower(s[j])
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 2017-08-29
    • 1970-01-01
    • 2019-01-08
    相关资源
    最近更新 更多