Maison  >  Article  >  développement back-end  >  Comment réaliser un tri insensible à la casse avec sort.Strings() dans Golang ?

Comment réaliser un tri insensible à la casse avec sort.Strings() dans Golang ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-31 04:25:01690parcourir

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

Tri insensible à la casse avec sort.Strings() dans Golang

Dans Go, la fonction sort.Strings() est une fonction simple et outil polyvalent pour trier les tranches de cordes. Cependant, par défaut, son ordre de tri est sensible à la casse. Pour effectuer un tri insensible à la casse, nous devons lui fournir une fonction de comparaison personnalisée.

Équivalent Python

En Python, un tri insensible à la casse peut être réalisé en utilisant le paramètre clé de la fonction sorted(), comme indiqué dans le code suivant :

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

Go Implémentation

L'équivalent de ce code Python dans Go peut être réalisé en utilisant sort.Slice() et une fonction less personnalisée :

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

Ce code crée une nouvelle tranche appelée data et le trie en utilisant la fonction less fournie. La fonction less compare les versions minuscules des chaînes aux indices i et j. Cela garantit que les chaînes avec des représentations minuscules identiques sont considérées comme égales.

Comparaison basée sur les runes

Bien que l'approche ci-dessus fonctionne pour les petites listes, elle peut être inefficace pour les grandes listes. en raison de l'allocation de nouvelles chaînes pour chaque comparaison. Pour optimiser cela, on peut comparer les chaînes rune par 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>

Ce code compare les versions minuscules des runes dans chaque chaîne et renvoie vrai si la version minuscule de la première chaîne est inférieure à celle de la deuxième chaîne.

Tri sensible au langage

Bien que les approches ci-dessus fournissent tri insensible à la casse, ils ne prennent pas en compte les règles spécifiques à la langue ou à la culture. Pour de tels scénarios, reportez-vous au package Collate pour un tri tenant compte des paramètres régionaux.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn