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第二个字符串。
语言感知排序
虽然上述方法提供不区分大小写的排序,但它们没有考虑特定于语言或文化的规则。对于此类场景,请参考 collate 包进行区域设置感知排序。
以上是如何在Golang中使用sort.Strings()实现不区分大小写的排序?的详细内容。更多信息请关注PHP中文网其他相关文章!