2015-09-07 1 views
4

Je sais que compareTo retourne un résultat négatif ou positif sur la façon dont une chaîne est en corrélation avec l'autre, mais alors pourquoi:Comment fonctionne la fonction de comparaison?

public class Test { 
    public static void main(String[] args) { 
     String y = "ab2"; 
     if(y.compareTo("ac3") == -1) { 
      System.out.println("Test"); 
     } 
    } 
} 

est vrai et

public class Test { 
    public static void main(String[] args) { 
     String y = "ab2"; 
     if(y.compareTo("ab3") == -1) { 
      System.out.println("Test"); 
     } 
    } 
} 

est également vrai?

+2

N'utilisez pas '== - 1' mais' <0'. Notez que '" ab2 ".compareTo (" cb2 ")' renvoie -2, tout comme '" ab2 ".compareTo (" ab4 ")' (le résultat est différent dans Unicode Table de caractères qui sont différents dans les index de chaînes - si longueur des chaînes est la même). – Pshemo

+0

La comparaison utilisant 'compareTo' n'utilise pas de corrélation: la corrélation est une propriété symétrique, alors que' compareTo' est (ou devrait être) anti-symétrique, au moins dans le sens où 'sign (a.compareTo (b)) = -sign (b.compareTo (a)) '. –

Répondre

6

Le contrat général de Comparable.compareTo(o) est de retourner

  • un nombre entier positif si cela est plus grand que l'autre objet.
  • un entier négatif si celui-ci est inférieur à l'autre objet.
  • 0 si cela est égal à l'autre objet.

Dans votre exemple "ab2".compareTo("ac3") == -1 et "ab2".compareTo("ab3") == -1signifie que que "ab2" est inférieur à la fois "ac3" et "ab3". Vous ne pouvez rien conclure concernant "ac3" et "ab3" avec seulement ces exemples.

Ce résultat est attendu depuis b vient avant c dans l'alphabet (si "ab2" < "ac3") et 2 vient avant 3 (si "ab2" < "ab3"): trie Java Strings lexicographically.

1

compareTo pour les performances des String -1 si la première String (celle pour laquelle la méthode est appelée) vient avant la deuxième String (argument de la méthode) dans l'ordre lexicographique. "ab2" vient avant "ab3" (puisque les deux premiers caractères sont égaux et 2 vient avant 3) et aussi avant "ac3" (puisque le premier caractère est égal et b vient avant c), donc les deux comparaisons retournent -1.

+1

Plus précisément: compareTo for Strings renvoie un nombre négatif_ si la première chaîne vient avant la deuxième chaîne – Tunaki

1

compareTo() compare deux chaînes en ce qui concerne leur ordre alphabétique. Les deux tests ont une chaîne triée alphabétiquement "avant" la chaîne avec laquelle vous la comparez. En d'autres termes:

  • AB2 < ac3 (parce que b < c)
  • AB2 < AB3 (car 2 < 3)

Par ailleurs, vous devriez plutôt utiliser "< 0" que "== -1" dans votre instruction if, car la spécification compareTo indique que la fonction renvoie un nombre négatif, pas spécifiquement "-1"

+1

++ pour la partie BTW. – Pshemo