2017-07-09 15 views
1

ここには、Arrays.binarySearchを理解するために構築した単純なコードがあります。しかし、それは私が期待していなかった結果を返しています。ここでJava - 配列binarySearchはカスタムソート後に予期しない結果を返します

String[] c = {"A", "Z", "B"}; 
    Arrays.sort(c, new MyNewComparator1()); //Z, B, A 
    System.out.println(Arrays.binarySearch(c, "Z")); //0 
    System.out.println(Arrays.binarySearch(c, "S")); //-2 based on insertion point 
    System.out.println(Arrays.binarySearch(c, "N")); //Unpredicable result we can expect 

私のカスタムコンパレータ

class MyNewComparator1 implements Comparator<String> { 
    public int compare(String s1, String s2) { 
     return s2.compareTo(s1); 
    } 
} 

結果である私は0, -2, Unpredictable

を期待しています。しかし、誰かがそれを返している理由を理解するために私を助けてくださいすることができ、結果はそれが-4, -4, -4

を返しますすべての検索のための-4? Javadocの状態として

おかげ

+1

。 'Arrays.binarySearch(T []、T、Comparator )'でオーバーロードを使ってみてください。予想される結果を返します( '' N "'だけでも '-2'も返すと思いますが...)。 – user2478398

答えて

7

、あなたの配列でなければなりません:

配列は、(sort(Object [])法などによって)その要素の 自然順序付けに従って昇順にソートしなければなりませんこの呼び出しを行う前に

上記の明確化を指すsort(Object [])方法は:

その要素の自然順序付けに に従って、昇順にオブジェクトの指定された配列をソート。

あなたは昇順にソートする必要がありますが、降順にソートされています。

あなたがソート昇順ためにそれを作るためにあなたのコンパレータを変更する必要があります。

class MyNewComparator1 implements Comparator<String> { 
    public int compare(String s1, String s2) { 
     return s1.compareTo(s2); // <-- swap s1 and s2 
    } 
} 

代替ソリューションがあります。 昇順のの意味は、最終的な引数としてbinarySearchメソッド呼び出しに独自のコンパレータを渡すことで、を再定義することができます。あなたがそれを行う場合、コンパレータを変更しないでください - 最初に投稿したままにしておきます。しかしbinarySearchメソッド呼び出しを変更します。それは `Comparator`が、あなたのリストをソートするために使用してきたのか分からないん

MyNewComparator1 comparator = new MyNewComparator1(); 
System.out.println(Arrays.binarySearch(c, "Z", comparator)); // 0 
System.out.println(Arrays.binarySearch(c, "S", comparator)); // -2 based on insertion point 
System.out.println(Arrays.binarySearch(c, "N", comparator)); // Unpredicable result we can expect