ソートされた文字列の配列があります。接頭辞を識別する文字列が与えられた場合、2 つのバイナリ検索を実行して、その接頭辞で始まる単語を含む配列内の最初と最後の位置を見つけます。
string [] words = {"aaa","abc","abcd","acd"};
string prefix = "abc";
int firstPosition = Array.BinarySearch<string>(words, prefix);
int lastPosition = Array.BinarySearch<string>(words, prefix + char.MaxValue);
if (firstPosition < 0)
firstPosition = ~firstPosition;
if (lastPosition < 0)
lastPosition = ~lastPosition;
このコードを実行すると、firstPosition と lastPosition の両方が 1 になります。正しい答えは、lastPosition を 3 にすることです (つまり、一致しない最初の単語を指します)。BinarySearch メソッドは CompareTo メソッドを使用してオブジェクトを比較します。
("abc"+char.MaxValue).CompareTo("abc")==0
つまり、2 つの文字列は等しいと見なされます。コードを変更すると
int lastPosition = Array.BinarySearch<string>(words, prefix + "z");
正しい答えが得られます。さらに、私はそれを発見しました
("abc"+char.MaxValue)==("abc")
正しく(私のニーズに関して)falseを返します。
CompareTo メソッドの動作を説明していただけませんか?
BinarySearch メソッドが lastPosition に対して 3 を返すように、CompareTo メソッドを == のように動作させたいと考えています。