Les collators : un autre moyen de comparaison

Il nous est tous arrivé d'avoir à comparer des chaînes de caractères dans nos programmes Java.
Tout le monde connaît les 2 méthodes de comparaison de la classe java.lang.String :

  • compareTo (qui permet de comparer 2 chaînes de caractères)
  • compareToIgnoreCase (qui permet de comparer 2 chaînes de caractères sans tenir compte de la casse (minuscules ou majuscules))

Mais il existe également une autre classe (fournie avec le JDK) qui permet de faire des comparaisons plus élaborées : il s'agit de la classe java.text.Collator.

Petit tour d'horizon des possibilités offertes par les collators.

Pour information, la comparaison des chaînes de caractère se fait à partir de la valeur Unicode de leurs caractères.
A partir de là, l'ordre de comparaison est le suivant :

espaces < chiffres < lettres majuscules < lettres minuscules 

Mais les choses se compliquent lorsque l'on souhaite faire une comparaison plus évoluée sans tenir compte de l'accentuation des caractères.
Par exemple, on souhaite que les chaînes de caractères "aout" et "Août" soient considérées identiques.

La solution est alors de passer par l'utilisation de la classe java.text.Collator et de l'attribut strength qui permet de déterminer la manière
avec laquelle 2 caractères seront considérés identiques ou différents.

L'attribut strength se décline selon 3 niveaux :

  • Le niveau "primaire" : la comparaison de 2 caractères prend en compte uniquement les caractères de base (pas de prise en compte de l'accentuation ni de la casse)
  • Le niveau "secondaire" : la comparaison de 2 caractères prend en compte les caractères de base ET les accents
  • Le niveau "tertiaire" : la comparaison de 2 caractères prend en compte les caractères de base ET les accents ET la casse

Rien de tel qu'un petit exemple pour mieux illustrer ces 3 niveaux.

La classe de Comparator de String utilisant un Collator :

/**
 * Comparator de String en utilisant les collators.
 * @author Netapsys
 * @version $Revision$ $Date$
 */
public class StringCollatorComparator
    implements Comparator<String>
{
    /**
     * Collator.
     */
    private final Collator collator;

    /**
     * Constructeur.
     * @param strength Niveau de comparaison à appliquer au collator.
     */
    public StringCollatorComparator(final int strength)
    {
        this.collator = Collator.getInstance(Locale.FRANCE);
        this.collator.setStrength(strength);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int compare(final String str1,
                       final String str2)
    {
        return this.collator.compare(str1,
                                     str2);
    }
}

Et le programme main permettant de tester notre comparator :

public static void main(final String[] args)
{
    // Comparaison Niveau Primaire (base char)
    StringCollatorComparator compPrim = 
              new StringCollatorComparator(Collator.PRIMARY);
    // Egalité
    System.out.println(compPrim.compare("aout", "Août"));

    // Comparaison Niveau Secondaire (base char + accents)
    StringCollatorComparator compSec =
              new StringCollatorComparator(Collator.SECONDARY);
    // Chaînes différentes
    System.out.println(compSec.compare("aout", "Août"));
    // Egalité
    System.out.println(compSec.compare("aout", "Aout"));

    // Comparaison Niveau Tertiaire (base char + accents + casse)
    StringCollatorComparator compTer = 
              new StringCollatorComparator(Collator.TERTIARY);
    // Chaînes différentes
    System.out.println(compTer.compare("aout", "Août"));
    // Chaînes différentes
    System.out.println(compTer.compare("aout", "Aout"));
}

L'utilisation des collators permettront de remplacer les très verbeux str.replace('é', 'e'). replace('è', 'e').replace('ê', 'e')...
pour toutes les comparaisons qui ne veulent pas prendre en compte l'accentuation des caractères.

4 commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.