javateux
Messages postés94Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention 3 juillet 2004
-
1 juin 2004 à 11:31
verdy_p
Messages postés202Date d'inscriptionvendredi 27 janvier 2006StatutMembreDernière intervention29 janvier 2019
-
25 févr. 2009 à 19:40
bonjour, quelqu'un connait-il une methode permettant de trier des string par ordre alphabetique?
verdy_p
Messages postés202Date d'inscriptionvendredi 27 janvier 2006StatutMembreDernière intervention29 janvier 2019 25 févr. 2009 à 19:40
Attention à ce qu'on entend par "tri alphabétique". Le tri lexicographique (tel que réalisé par String.compareTo) n'est PAS un tri alphabétique (il classe "Z" avant "a")
Pour trier correctement dans l'ordre alphabétique, il faut utiliser un comparateur (voir l'interface Comparator) et le donner en paramètre de la méthode de tri. String.compareTo() n'est pas un comparateur mais un Comparable (c'est une méthode de l'objet prenant un seul paramètre et non une fonction statique prenant deux paramètres), mais se contente de trier dans l'ordre binaire des caractères (dans l'ordre numérique des codets UTF-16 stockés dans les "char" contenus dans la chaine, ce qu'on appelle parfois l'ordre "lexicographique" même si c'est un très mauvais terme ne traduisant rien du tout au plan lexical comme au plan graphique, surtout en présence d'Unicode!).
Pour créer un comparateur alphabétique, il faut créer une classe implémentant Comparator et définissant donc la méthode statique de comparaison à deux paramètres.
Ses paramètres sont des Object et pas directement des String: dans le code de la méthode il faut encore utiliser un "typecast" en (String).
L'autre solution est de le définir de façon générique en implémentant Comparator<string> (en Java 1.4 ou 5+), ce qui évite le typecast peu performant à l'exécution, et utiliser donc un tri générique.
On ne peut pas s'en passer car la classe String n'est pas surchargeable (elle est finale).
Le contenu du comparateur est dépendant du type de comparaison à faire, mais en général on compare d'abord les chaînes converties en casse simple, avant de comparer les autres caractères.
Pour prendre en compte un tri plus précis, adapté par exemple à la langue française, le code est plus complexe et nécessite le calcul préalable d'une clé de collation (avec un collateur instancié en tant que champ de l'objet comparateur lui-même, afni de le réutiliser au lieu de l'isntancier à chaque comparaison durant le tri): la conversion de chaine en clé de collation avec ce collateur permet ensuite un tri lexicographique des éléments binaires de chaque clé. Le clacul des clés de collation s'effectue sur plusieurs niveaux: caractères de base, puis accents et diacrituques (depuis la fin de chaîne vers le début en français!), puis différence de casse des caractères de base, puis classement des autres différences non ignorables, et enfin classement des caractères ignorables et autres différences avec un tri binaire. C'est ce qu'on appelle un tri multiniveau.
D'autres options peuvent être considérées pour prendre en compte aussi la valeur numérique des nombres inclus dans les chaînes, au lieu de les traiter chiffre par chiffre.</string>