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

avec Java Discussion :

Vérifier si une chaîne de caractère est contenu dans une autre


Sujet :

avec Java

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 137
    Points : 157
    Points
    157
    Par défaut Vérifier si une chaîne de caractère est contenu dans une autre
    Bonjour,

    Tout est dans le titre. Je rajouterais que la chaine globale peut varier entre trois cas "abc,def,ghi", "abc,def" ou "abc". Sachant que les 3 chaines de caractères peuvent permuter entre elles ("abc,def" ou"def,abc"). Je dois vérifier si ma chaine de départ (soit "abc", soit "def", soit "ghi") est contenue dans l'autre chaine.

    Ma réflexion se pose sur le choix de la méthode dans un esprit de simplicité et surtout d'efficacité. Moins d'itération je fais, mieux ce sera.

    Pour ma part, j'ai trouvé trois méthodes:
    • Soit on fait des substring à des endroit particuliers où on sait que la chaine va apparaître
    • Soit on fait une étude globale du texte et on cherche si la chaine est contenu
    • Utiliser IndexOf


    Laquelle entre ces trois méthodes serait la plus rapide à moins qu'il existe une autre meilleure.

  2. #2
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    il faudrait savoir comment fonctionne ces méthodes en interne donc regarder leurs codes sources mais il y a des chances qu'elles soient déjà bien optimisées. T'as aussi la possibilité d'utiliser une REGEX ou encore d'exploder ta chaîne en tableau et de parcourir le tableau. indexOf() me semble la plus appropriée car tu n'auras qu'un seul appel à cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	String str = "abc,def,ghi";
    	String search = "def";
    	System.out.println(str.indexOf(search));
    Sinon l'algo basique qui me semblerait le plus efficace et de parcourir tous les char de la chaîne et de passer à la sous-chaîne suivante (incrémenter jusqu'à ce que la char courant lu soit ',') dès qu'un char n'est pas dans la chaîne recherchée.
    A priori je dirais que charAt() est moins optimisé qu'un accès direct au tableau de char.

    Mais dans tous les cas, il n'y aura pas de différences de perfs entre ces différentes méthodes tant que tu ne les appliqueras pas sur des chaînes très longues.

  3. #3
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 372
    Points
    2 372
    Par défaut
    Bonjour,

    à moins que la nombre de test que tu ai a faire soit vraiment très grand,
    il n'y pas besoin de se poser des questions d'optimisation.

    Au début, tu fait simple avec int indexOf(String str).

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 137
    Points : 157
    Points
    157
    Par défaut
    Lut,

    En effet, j'ai un peu tester de tout, étant donné que je n'ai pas une très grande chaine de caractères, je vais rester sur IndexOf qui est la plus simple à écrire. Merci pour vos réponses.

    Par contre à présent, je dois faire une fonction de recherche généralisé sur un texte plutôt grand, quelque dizaines de page.

    Faut-il réutiliser la fonction indexOf ou c'est plutôt déconseillé pour un long texte?

  5. #5
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 372
    Points
    2 372
    Par défaut
    Dans ce cas, j'aurais crée un analyseur syntaxique avec le parseur SAX.
    Mais je suis curieux de voir comment feraient les autres

  6. #6
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Tu peux saxer du texte non balisé ?
    Perso, s'il y a un seul mot à rechercher je pense que indexOf() le fait toujours. Sinon j'utiliserais une bonne vieille REGEX.
    Ca dépend aussi si la totalité du texte est stockable en mémoire (10 pages pas de soucis)

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 137
    Points : 157
    Points
    157
    Par défaut
    En fait, je dois faire une recherche à l'intérieur d'une map.

    Je possède une map de ce type Map<String,Map<String, String>>.
    Le premier string contient à ma clé, et la deuxième à une deuxième map. Dans la deuxième map, le premier string correspond à une autre clé et la deuxième aux informations.

    Mon but est d'effectuer une recherche dans les données.

    Donc pour cela, je crée une boucle for avec un iterator et un switch de ce genre là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (Iterator<Map<String, String>> i = map.values().iterator() ; i.hasNext() ;){
    switch (...){
    case 1 : ...
    break;
    }
    Dès que je trouve un résultat, je fais un break et je retourne la 1ère Key, à la fonction appelante. Seulement, je dois vérifier dans toute la map les concordances existantes. Donc il faut que je continue ma boucle.

    La question que je me pose, c'est comment faire pour que la recherche ne reprenne pas à zéro mais là où je me suis arrêté. Pour eviter une boucle infinie.

    Faut-il que je crée une fonction private à iterator dans la classe afin qu'il garde en mémoire la position où il se trouve et que je lui dise de faire un next ?


    Edit: j'ai trouvé une solution, il s'agit de créer un tableau qui va récupérer toutes les clés dans la map et ensuite faire une boucle for avec ce tableau et étudier pour chaque clé si le texte recherché est contenu dans la map (à partir de la clé).

  8. #8
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 372
    Points
    2 372
    Par défaut
    Bonjour Djakisback

    Tu peux saxer du texte non balisé ?
    L'auteur de "Java et XSLT" aux éditions O'Reilly en donne un exemple
    en analysant un fichier CSV.

    Concernant indexOf(), je crois qu'il suffit de tester. Et il est claire que pour une seule chaîne cela doit suffire, quitte à découper le fichier en morceaux.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/10/2014, 11h28
  2. Réponses: 7
    Dernier message: 07/02/2013, 19h36
  3. Réponses: 4
    Dernier message: 06/07/2011, 10h35
  4. Réponses: 8
    Dernier message: 16/05/2008, 11h34
  5. Réponses: 2
    Dernier message: 06/10/2007, 00h49

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