IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

[Comparaison]Utiliser Collator ou RegEx ?


Sujet :

Langage Java

  1. #1
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut [Comparaison]Utiliser Collator ou RegEx ?
    Bonjour,

    Je souhaiterai faire une recherche de chaine de caractère parmis une (grande) liste de chaine de caractère. Une des contraintes est que la recherche ne doit pas être case sensitive ('a' == 'A') et que les signes d'accentuations doivent être ignoré ('a' == 'à').
    Pour l'instant j'ai mis en place un système de recherche basé sur les expressions régulières. Voici mon algo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    private String parsePrefix(String prefix) {
      StringBuffer newPrefix = new String();
      int length = prefix.length();
      for(int i = 0; i < length; i++) {
    	char c = prefix.charAt(i);
    	if (c == 'e' || c == 'é' || c == 'è' || c == 'ê' || c == 'ë') {
    		newPrefix.append("[eéèêë]");	
    	} else if (c == 'a' || c == 'à' || c == 'â' || c == 'ä') {
    		newPrefix.append("[aàâä]");
    	} else if (c == 'i' || c == 'ì' || c == 'î' || c == 'ï') {
    		newPrefix.append("[iìîï]");
    	} else if (c == 'u' || c == 'ù' || c == 'û' || c == 'ü') {
    		newPrefix.append("[uùûü]");
    	} else if (c == 'o' || c == 'ò' || c == 'ô' || c == 'ö') {
    		newPrefix.append("[oòôö]");
    	} else if (c == 'c' || c == 'ç') {
    		newPrefix.append("[cç]");
    	} else {
    		newPrefix.append(c);
    	}
      }
     
      return newPrefix.toString();
    }
     
    private void recherche(String mot) {
       //Le mot doit être le début de la phrase
       String nouveau_mot = "^" + parsePrefix(mot);
       Pattern pattern = Pattern.compile(nouveau_mot, Pattern.CASE_INSENSITIVE);
      //data est une liste de String
      //result est la liste où je stocke les résultats
      for(Iterator<String> it = data.iterator(); it.hasNext(); ) {
    		String value = it.next();
    		if (compareTo(value, pattern)) {
    			result.add(value);
    		}
      }
      // ....
    }
     
    private boolean compareTo(String value, Pattern pattern) {
    	Matcher matcher = pattern.matcher(value);
    	return (matcher.find());
    }
    Maintenant je voudrais savoir si j'optais pour la solution décrite dans la FAQ (http://java.developpez.com/faq/java/...compare_locale) en utilisant les Collator, est-ce que mon code s'en retrouverai optimisé (et plus propre ) ?
    Ou eventuellement si vous avez une autre solution ? ^^

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Largement plus propre (ensuite optimisé c'est à voire, mais de toute façon en général mieux vaut avoir un code propre qu'optimisé à mort, enfin c'est un navis personnel).
    D'autant plus qu'avec un Collator tu peux gérer le niveau de comparaison (prise en compte des accents ou non, idem avec la casse...)

  3. #3
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    Juste pour indiquer que j'ai gardé ma première solution suite à des besoins non supporté par collator. La première chaine ne devait plus être égale à la seconde (plus ou moins les accents et majuscules), mais elle devait être contenu dans la seconde (plus ou moins les accents et majuscules).
    Donc pour l'instant je garde cette solution.

    merci quand même de t'être interessé au problème

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation de Boost.Regex
    Par ram-0000 dans le forum Boost
    Réponses: 7
    Dernier message: 18/05/2010, 19h44
  2. utiliser collate avec GROUP_CONCAT
    Par GLSpirit dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 24/10/2007, 15h43
  3. Utilisation incongrue des regex
    Par d-jo dans le forum Langage
    Réponses: 5
    Dernier message: 19/06/2007, 15h44
  4. Utilisation des fonctions regex
    Par ellow dans le forum C
    Réponses: 2
    Dernier message: 05/06/2006, 22h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo