php editor Strawberry が、`sort.Slice` 関数に関する重要な情報をいくつか紹介します。 Go 言語では、スライスのソートには `sort.Slice` 関数が使用されますが、そのソート結果の順序は未定義です。つまり、同じ入力スライスでも、ソートの結果は毎回異なる可能性があります。これは、`sort.Slice` 関数が高速で効率的な並べ替えアルゴリズムを使用しているためですが、並べ替えの特定の順序は入力データの特定の条件に基づいているためです。したがって、`sort.Slice` 関数を使用するときは、特定の並べ替え順序に依存するシナリオでの問題を回避するために、並べ替え結果の非決定性を認識する必要があります。
go標準ライブラリのsort.slice
を使用して文字列スライスをソートしようとしています。 を除き、アルファベット順に並べ替えたいのですが、空の文字列が他のすべての文字列の後に表示されるようにしたいのです (したがって、単に sort.strings を使用することはできません)。
リーリー
ただし、入力順に基づいてランダムな回答が得られるようです。これは私です:リーリー
これは、数回実行した場合の出力です:
func(i, j int) bool { return s[j] == "" || s[i] < s[j] }
less() 関数が必要なことを示していないためです。
リーリー
これにより、2 番目が"" であるかどうか、最初の値が小さいことがわかります。これは多かれ少なかれ真実です (両方が空でない限り、「is-less」は真ではありません。つまり、それらは等しいです)。しかし、最初のものが
"" で、2 つ目がそうでない場合はどうなるでしょうか?この場合、関数は
false を返すはずですが、
s[i] < s[j] を返します。
true 2 番目のものが空でない場合は、
"" が他のものより小さくなるように指示します。これは、希望するものとはまったく逆です。
リーリー
2 番目のみ"" の場合は、最初の値を小さくする必要があります。最初の 1 つだけが空の場合は、それを「以上」にする必要があります。それ以外の場合は、通常の順序 (バイト単位) が使用されます。
で試してみましょう。 最初と 2 番目の値が両方とも空の場合、
"" は ""
より小さくないため、この関数は false
を返すことに注意してください。 (それらは等しい)。これは返す正しい値ですが、ここで true
を返すと正しい順序になります (空の要素を交換しても同じ結果になります) が、これにより交換が少なくなる可能性があります。
XOR 変換ロジックを使用する
です: a のみまたは b
のみが ## の場合、a xor b
は true
です#真実###。 Go には論理 xor
演算子はありませんが、a xor b
は a != b
と同等です。
空の文字列が「検出」された場合、2 番目の空の文字列が空の場合、結果は true
(それ以外の場合は
) になります。したがって、この恒等変換をロジックに適用できます。
リーリー
これは短く、おそらくより効率的ですが、ご覧のとおり、理解するのが難しくなります。このオプションは、パフォーマンスが重要な場合にのみ使用してください。 go playground
でこれを試してください。
以上が`sort.Slice` の順序は未定義ですの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。