sorting - 如何在 Golang 中使用 sort.Strings() 进行不区分大小写的排序?

标签 sorting go

有什么方法可以通过 sort.Strings() 中的自定义函数对字符串列表进行不区分大小写的排序吗?

data := []string{"A", "b", "D", "c"}

输出应该是:A, b, c, D

Python 中上述要求的等价物如下:

li = sorted(data, key=lambda s: s.lower())

我们在 golang 中有类似的东西吗?

最佳答案

Python 代码到 Go 的翻译是:

sort.Slice(data, func(i, j int) bool { return strings.ToLower(data[i]) < strings.ToLower(data[j]) })

Run it on the Go Playground .

这种做法和题中的Python代码一样,可以为每次比较分配两个字符串。对于问题中的示例,分配可能没问题,但在其他情况下可能会出现问题。

为避免分配,逐个比较字符串 rune:

func lessLower(sa, sb string) bool {
    for {
        rb, nb := utf8.DecodeRuneInString(sb)
        if nb == 0 {
            // The number of runes in sa is greater than or 
            // equal to the number of runes in sb. It follows
            // that sa is not less than sb.
            return false
        }

        ra, na := utf8.DecodeRuneInString(sa)
        if na == 0 {
            // The number of runes in sa is less than the
            // number of runes in sb. It follows that sa
            // is less than sb.
            return true
        }

        rb = unicode.ToLower(rb)
        ra = unicode.ToLower(ra)

        if ra != rb {
            return ra < rb
        }

        // Trim rune from the beginning of each string.
        sa = sa[na:]
        sb = sb[nb:]
    }
}
⋮
sort.Slice(data, func(i, j int) bool { return lessLower(data[i], data[j]) })

Run it on the Go Playground .

看看 collate package如果您需要按特定于语言或文化的排序顺序进行排序。

关于sorting - 如何在 Golang 中使用 sort.Strings() 进行不区分大小写的排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51997276/

相关文章:

ruby - 为什么我不能按 `count` 对字符串数组进行排序?

go - 从 gorm 模型创建主键时出现问题

go - 如何修改for循环中的 slice ?

go - 访问在结构内声明的列表时出现类型断言错误

javascript - Sort Elements jQuery Plugin,随机排序

sorting - 是否有任何机器人框架关键字来对具有特殊字符的字符串列表进行排序?

regex - 如何在复杂的golang正则表达式捕获中捕获多个组

inheritance - Golang 继承和方法覆盖

objective-c - 如何使用嵌套 NSArray 对 NSArray 进行排序

python - 如何使用自定义条件对一个列表列表进行排序?