Heim >Backend-Entwicklung >Golang >Wie erreicht man mit sort.Strings() in Golang eine Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung?

Wie erreicht man mit sort.Strings() in Golang eine Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung?

Susan Sarandon
Susan SarandonOriginal
2024-10-31 04:25:01776Durchsuche

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

Groß-/Kleinschreibung nicht berücksichtigendes Sortieren mit sort.Strings() in Golang

In Go ist die Funktion sort.Strings() eine einfache und vielseitiges Werkzeug zum Sortieren von String-Slices. Bei der Sortierreihenfolge wird jedoch standardmäßig die Groß-/Kleinschreibung beachtet. Um eine Sortierung ohne Berücksichtigung der Groß-/Kleinschreibung durchzuführen, müssen wir ihr eine benutzerdefinierte Vergleichsfunktion zur Verfügung stellen.

Python-Äquivalent

In Python kann eine Sortierung ohne Berücksichtigung der Groß-/Kleinschreibung mithilfe von erreicht werden Schlüsselparameter der Funktion sorted(), wie im folgenden Code gezeigt:

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

Go-Implementierung

Das Äquivalent dieses Python-Codes in Go kann erreicht werden Verwenden von sort.Slice() und einer benutzerdefinierten Less-Funktion:

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

Dieser Code erstellt ein neues Slice namens data und sortiert es mithilfe der bereitgestellten Less-Funktion. Die Funktion „less“ vergleicht die kleingeschriebenen Versionen der Zeichenfolgen an den Indizes i und j. Dadurch wird sichergestellt, dass Zeichenfolgen mit identischer Darstellung in Kleinbuchstaben als gleich betrachtet werden.

Runenbasierter Vergleich

Während der obige Ansatz für kleine Listen funktioniert, kann er für große Listen ineffizient sein aufgrund der Zuweisung neuer Zeichenfolgen für jeden Vergleich. Um dies zu optimieren, können wir Zeichenfolgen Rune für Rune vergleichen:

<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>

Dieser Code vergleicht die kleingeschriebenen Versionen der Runen in jeder Zeichenfolge und gibt „true“ zurück, wenn die kleingeschriebene Version der ersten Zeichenfolge kleiner als die der ist zweite Zeichenfolge.

Sprachbewusste Sortierung

Während die oben genannten Ansätze eine Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung ermöglichen, berücksichtigen sie keine sprach- oder kulturspezifischen Regeln. Sehen Sie sich für solche Szenarien das Paket „Collate“ für die gebietsbezogene Sortierung an.

Das obige ist der detaillierte Inhalt vonWie erreicht man mit sort.Strings() in Golang eine Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn