首页  >  文章  >  后端开发  >  如何在Golang中使用sort.Strings()实现不区分大小写的排序?

如何在Golang中使用sort.Strings()实现不区分大小写的排序?

Susan Sarandon
Susan Sarandon原创
2024-10-31 04:25:01690浏览

How to Achieve Case-Insensitive Sorting with sort.Strings() in Golang?

Golang 中使用 sort.Strings() 进行不区分大小写的排序

在 Go 中,sort.Strings() 函数是一个简单的函数用于对字符串切片进行排序的多功能工具。但是,默认情况下,其排序顺序区分大小写。要执行不区分大小写的排序,我们需要为其提供自定义比较函数。

Python 等效

在 Python 中,可以使用以下方法实现不区分大小写的排序sorted()函数的key参数,如下代码所示:

<code class="python">li = sorted(data, key=lambda s: s.lower())</code>

Go实现

这段Python代码在Go中可以实现等价使用 sort.Slice() 和自定义 less 函数:

<code class="go">sort.Slice(data, func(i, j int) bool { return strings.ToLower(data[i]) < strings.ToLower(data[j]) })</code>

此代码创建一个名为 data 的新切片,并使用提供的 less 函数对其进行排序。 less 函数比较索引 i 和 j 处字符串的小写版本。这可以确保具有相同小写表示的字符串被认为是相等的。

基于符文的比较

虽然上述方法适用于小型列表,但对于大型列表可能效率较低由于每次比较都会分配新的字符串。为了优化这一点,我们可以逐个比较字符串符文:

<code class="go">func lessLower(sa, sb string) bool {
    for {
        rb, nb := utf8.DecodeRuneInString(sb)
        if nb == 0 {
            return false
        }

        ra, na := utf8.DecodeRuneInString(sa)
        if na == 0 {
            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]) })</code>

此代码比较每个字符串中符文的小写版本,如果第一个字符串的小写版本小于第一个字符串的小写版本,则返回 true第二个字符串。

语言感知排序

虽然上述方法提供不区分大小写的排序,但它们没有考虑特定于语言或文化的规则。对于此类场景,请参考 collat​​e 包进行区域设置感知排序。

以上是如何在Golang中使用sort.Strings()实现不区分大小写的排序?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn