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中文網其他相關文章!