ホームページ >バックエンド開発 >Golang >`sort.Slice` の順序は未定義です

`sort.Slice` の順序は未定義です

王林
王林転載
2024-02-10 12:12:101138ブラウズ

`sort.Slice` 顺序是不确定的

php editor Strawberry が、`sort.Slice` 関数に関する重要な情報をいくつか紹介します。 Go 言語では、スライスのソートには `sort.Slice` 関数が使用されますが、そのソート結果の順序は未定義です。つまり、同じ入力スライスでも、ソートの結果は毎回異なる可能性があります。これは、`sort.Slice` 関数が高速で効率的な並べ替えアルゴリズムを使用しているためですが、並べ替えの特定の順序は入力データの特定の条件に基づいているためです。したがって、`sort.Slice` 関数を使用するときは、特定の並べ替え順序に依存するシナリオでの問題を回避するために、並べ替え結果の非決定性を認識する必要があります。

質問内容

go標準ライブラリのsort.sliceを使用して文字列スライスをソートしようとしています。 を除き、アルファベット順に並べ替えたいのですが、空の文字列が他のすべての文字列の後に表示されるようにしたいのです (したがって、単に sort.strings を使用することはできません)。

less 関数の場合、これはうまくいくと思います:

リーリー

ただし、入力順に基づいてランダムな回答が得られるようです。これは私です:

リーリー

これは、数回実行した場合の出力です:

func(i, j int) bool {
    return s[j] == "" || s[i] < s[j]
}

解決策

これは、

less() 関数が必要なことを示していないためです。

空の文字列を空でない文字列の後に並べ替えたいと言いました。あなたのロジック:

リーリー

これにより、2 番目が

"" であるかどうか、最初の値が小さいことがわかります。これは多かれ少なかれ真実です (両方が空でない限り、「is-less」は真ではありません。つまり、それらは等しいです)。しかし、最初のものが "" で、2 つ目がそうでない場合はどうなるでしょうか?この場合、関数は false を返すはずですが、s[i] < s[j] を返します。 true 2 番目のものが空でない場合は、"" が他のものより小さくなるように指示します。これは、希望するものとはまったく逆です。

正しい「is-less」関係は次のようになります:

リーリー

2 番目のみ

"" の場合は、最初の値を小さくする必要があります。最初の 1 つだけが空の場合は、それを「以上」にする必要があります。それ以外の場合は、通常の順序 (バイト単位) が使用されます。

遊び場に行って

で試してみましょう。 最初と 2 番目の値が両方とも空の場合、

""

"" より小さくないため、この関数は false を返すことに注意してください。 (それらは等しい)。これは返す正しい値ですが、ここで true を返すと正しい順序になります (空の要素を交換しても同じ結果になります) が、これにより交換が少なくなる可能性があります。 XOR 変換ロジックを使用する

カスタム ロジックでは、1 つの文字列だけが空の場合、通常の順序から外れることに注意してください。これは

論理 XOR (XOR) 関係

です: a のみまたは b のみが ## の場合、a xor btrue です#真実###。 Go には論理 xor 演算子はありませんが、a xor ba != b と同等です。 空の文字列が「検出」された場合、2 番目の空の文字列が空の場合、結果は true (それ以外の場合は

false

) になります。したがって、この恒等変換をロジックに適用できます。 リーリー これは短く、おそらくより効率的ですが、ご覧のとおり、理解するのが難しくなります。このオプションは、パフォーマンスが重要な場合にのみ使用してください。 go playground でこれを試してください。

以上が`sort.Slice` の順序は未定義ですの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。