2017-07-09 1 views
1

Voici le simple morceau de code que je construis pour comprendre Arrays.binarySearch. Mais il retourne un résultat auquel je ne m'attendais même pas.Java - Arrays binarySearch renvoyant un résultat inattendu après tri personnalisé

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 

Voici mon Comparator personnalisé

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

Résultat J'attends 0, -2, Unpredictable

Mais le résultat, il revient -4, -4, -4

Quelqu'un peut-il s'il vous plaît aidez-moi à comprendre pourquoi il est de retour -4 pour toute la recherche.

Merci

+1

Vous ne savez pas quel 'comparateur 'vous avez utilisé pour trier votre liste. Essayez d'utiliser la surcharge avec 'Arrays.binarySearch (T [], T, comparateur )'. Renvoie les résultats que vous attendez (bien que je pense que '" N "' retournerait '-2' aussi bien ...). – user2478398

Répondre

7

Comme les états Javadoc, votre tableau doit être:

Le tableau doit être trié dans l'ordre croissant selon la ordre naturel de ses éléments (comme par la méthode sort(Object [])) avant de passer cet appel.

Le procédé sort(Object []) que le fait référence ci-dessus pour clarifie:

Trie l'ensemble spécifié d'objets dans l'ordre croissant , selon à l'ordre naturel de ses éléments.

Vous devez trier dans ordre croissant mais vous triez dans décroissant ordre.

Vous devez changer votre comparateur pour faire en sorte ascendant ordre:

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

Il existe une solution alternative. Vous pouvez redéfinir ce que croissantsignifie en passant votre propre comparateur à l'appel de méthode binarySearch comme dernier argument. Si vous faites cela, ne changez pas le comparateur - laissez-le tel que vous l'avez initialement affiché. Mais modifiez les appels de méthode binarySearch:

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