ホームページ  >  記事  >  バックエンド開発  >  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 実装

Go のこの Python コードと同等の機能を実現できます。 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 を返します。 2 番目の文字列.

言語を意識した並べ替え

上記のアプローチでは大文字と小文字を区別しない並べ替えが提供されますが、言語や文化固有のルールは考慮されていません。このようなシナリオについては、ロケールを意識した並べ替えのための Collat​​e パッケージを参照してください。

以上がGolang で sort.Strings() を使用して大文字と小文字を区別しない並べ替えを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。