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

API standards et tierces Java Discussion :

Remplacement de sous-chaines


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite

    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 291
    Par défaut Remplacement de sous-chaines
    Bonjour,
    voilà mon problème :
    J'effectue de la substitution de sous-chaines de façon dynamique. L'idée de base est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    String content = ....;
     
    for(int id = 0 ; id < 10 ; id++) {
        content = content.replaceAll("Une expression faisant intervenir id", "une autre expression faisant intervenir id");
    }
    Ce qui d'après moi n'est pas super efficace puisque j'ai une nouvelle instance de String créée à chaque tour de boucle (sachant que les ID sont en fait récupérés en base et que donc il ne s'agit pas d'une boucle "simple")
    J'ai tenté ma chance avec du StringBuffer et les matchers mais le problème est qu'il faut resetter le matcher à chaque fois vu que je modifie le StringBuffer, ce qui est encore plus long que l'utilisation d'une chaine (cela dit je n'ai pas de données au niveau de l'impact mémoire
    Pour info la version StringBuffer a l'aspect suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for(int id = 0 ; id < 10 ; id++) {
    	String imageName = id + ".gif";
    	Pattern p = Pattern.compile("regex faisant intervenir ID");
    	Matcher m = p.matcher(sb);
    	while(m.find()) {
    		sb.replace(m.start(), m.end(), "<img src=\"" + imageName + '"');
    		m.reset();
    	}
    }
    Elle produit bien le même résultat mais est légèrement plus lente...
    http://beuss.developpez.com
    Tutoriels PostgreSQL, Assembleur, Eclipse, Java

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    A quoi ressemble ton "regex faisant intervenir ID" ? Il y a peut-être moyen de faire plus simple...

    a++

  3. #3
    Membre émérite

    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 291
    Par défaut
    à ça (de tête et sans despécialiser) : "<img src="[^"]servlet\?idImage=" + id + '"'
    Mes URL sont variables(avecou sans http, avec ou sans le nom d'hote, etc), donc je vois pas plus simple
    http://beuss.developpez.com
    Tutoriels PostgreSQL, Assembleur, Eclipse, Java

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Puisque id semble correspondre à un numérique tu peux facilement uniformiser ton pattern afin de ne faire qu'un seul passage. Tu sera quand même obligé d'utiliser un StringBuffer temporaire en plus de ta chaine mais cela te garantit de bonne performance pour un peu de mémoire en plus.

    Par exemple :
    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
        public static String transform(String str) {
            Pattern p = Pattern.compile("<img src=\"[^\"]*servlet\\?idImage=([0-9]+)\"");
            Matcher m = p.matcher(str);
            if (m.find()) {
                // ceci permet de ne pas créer de StringBuffer temporaire
                // si la chaine ne comporte aucun élément correspondant
                StringBuffer buffer = new StringBuffer();
                do {
                    String imageName = m.group(1) + ".gif";
                    m.appendReplacement(buffer, "<img src=\"" + imageName + '"');
                } while(m.find());
                m.appendTail(buffer);
                str = buffer.toString();
            }
            return str;
        }
    Que tu utilises comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s = // ta chaine
    s = transform(s);
    a++

    PS : si ton id n'est pas vraiment un numérique tu dois surement pouvoir adapter la regexp

  5. #5
    Membre émérite

    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 291
    Par défaut
    id est bien un numérique
    et de tête (toujours), ce que tu proposes est exactement l'implémentation de replaceAll dans le JDK 5.0 (de tête hein, je l'ai pas sous les yeux)...
    Je testerai je te dirai si c'est plus rapide...
    Edit : en utilisant un seul stringbuffer je peux peut être diminuer l'impact mémoire :
    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
        public static String transform(String str) {
            Pattern p = Pattern.compile("<img src=\"[^\"]*servlet\\?idImage=([0-9]+)\"");
            Matcher m = p.matcher(str);
            StringBuffer buffer = new StringBuffer(str.length);
            if (m.find()) {
                do {
                    String imageName = m.group(1) + ".gif";
                    m.appendReplacement(buffer, "<img src=\"" + imageName + '"');
                } while(m.find());
                m.appendTail(buffer);
                str = buffer.toString();
                buffer.clear();
            }
            return str;
        }
    http://beuss.developpez.com
    Tutoriels PostgreSQL, Assembleur, Eclipse, Java

  6. #6
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Et tu peux utiliser StringBuilder, il est à StringBuffer ce que ArrayList est à Vector

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/03/2008, 15h36
  2. [VB] lire lignes d'un fichier et remplacer une sous chaine
    Par horzy dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 04/06/2007, 20h58
  3. Réponses: 3
    Dernier message: 13/01/2007, 14h05
  4. Réponses: 3
    Dernier message: 05/01/2007, 15h50
  5. [Chaines] Remplacement de sous chaine simple
    Par Clorish dans le forum Delphi
    Réponses: 3
    Dernier message: 28/09/2006, 13h21

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