首頁  >  文章  >  後端開發  >  如何在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​​ 套件進行區域設定感知排序。

以上是如何在Golang中使用sort.Strings()實作不區分大小寫的排序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn