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

Susan Sarandon
Release: 2024-10-31 04:25:01
Original
708 people have browsed it

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

Case-Insensitive Sorting with sort.Strings() in Golang

In Go, the sort.Strings() function is a simple and versatile tool for sorting string slices. However, by default, its sorting order is case-sensitive. To perform case-insensitive sorting, we need to provide it with a custom comparison function.

Python Equivalent

In Python, case-insensitive sorting can be achieved using the key parameter of the sorted() function, as shown in the following code:

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

Go Implementation

The equivalent of this Python code in Go can be achieved using sort.Slice() and a custom less function:

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

This code creates a new slice called data and sorts it using the provided less function. The less function compares the lowercase versions of the strings at indices i and j. This ensures that strings with identical lowercase representations are considered equal.

Rune-Based Comparison

While the above approach works for small lists, it can be inefficient for large lists due to the allocation of new strings for each comparison. To optimize this, we can compare strings rune by rune:

<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>
Copy after login

This code compares the lowercase versions of the runes in each string and returns true if the lowercase version of the first string is less than that of the second string.

Language-Aware Sorting

While the above approaches provide case-insensitive sorting, they do not take into account language or culture-specific rules. For such scenarios, refer to the collate package for locale-aware sorting.

The above is the detailed content of How to Achieve Case-Insensitive Sorting with sort.Strings() in Golang?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!