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 :

Une boucle pour x répétitions


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2014
    Messages : 180
    Par défaut Une boucle pour x répétitions
    Hello
    alors j'ai un petit problème au niveau de la condition sur ma boucle pour faire une répétition.
    alors voila mes données :

    ici mon texte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     "#----------------------------------------------------------------------\n" +
            "#"+
    		"# Variables\n" +
    		"#----------------------------------------------------------------------\n" +
    		"#> hello\n" +
    		"d= \"{poli}_{gtr}_sylda_{BMW}\"\n" +
    		"x = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/SS\"\n" +
    		"y = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/EE\"\n" +
    		"u = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/GT\"\n" +
    		"u'  = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/UG\"\n" +
    		 "#< end \n" +
    		"z=  caln" +
    		"#----------------------------------------------------------------------\n";
    ici mon fichier xml :

    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
    <?xml version="1.0" encoding="utf-8"?>
    <parametters>
    	<value name ="poli">
    		"nono"
    	</value>
    	<value name ="gtr">
    		"pupupu"
    	</value>
    	<value name ="BMW">
    		"nounou"
    	</value>
    	<value name ="AUDI">
    		"m3"
    	</value>
    	<value name ="RN">
    		"Rs6"
    	</value>
    </parametters>
    et en faite j'ai fais un code qui permet de remplacer la clé par sa valeur c'est a dire par exemple "poli" sera remplacer dans le texte par "nono".

    voici le code :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    public class Mopl {
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
    		 final String ZONE_B = "#>";
    		  final String ZONE_E = "#<";
    		  final String VALUE_B = "{";
    		  final String VALUE_E = "}";
     
     
     
    		String texte = "#----------------------------------------------------------------------\n" +
            "#"+
    		"# Variables\n" +
    		"#----------------------------------------------------------------------\n" +
    		"#> hello\n" +
    		"d= \"{poli}_{gtr}_sylda_{BMW}\"\n" +
    		"x = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/SS\"\n" +
    		"y = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/EE\"\n" +
    		"u = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/GT\"\n" +
    		"u'  = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/UG\"\n" +
    		 "#< end \n" +
    		"z=  caln" +
    		"#----------------------------------------------------------------------\n";
     
    		int ao = 0;
    		int po = 0;
     
    //		while(ao >= 0 && po >= 0){
     
    		// Pour avoir les positions { et } 
    		ao = texte.indexOf(VALUE_B,po);
    		po = texte.indexOf(VALUE_E,ao);
    		//System.out.println("position 1 : " +ao);
    		//System.out.println("position 2 : " + po);
     
    		// ce qu'il y a entre { }
    		String a = texte.substring(ao+1, po);
    		//System.out.println(a);
     
    		// Ce qu'il y a avant {etude}
    		String b = texte.substring(0, ao-1);
    		//System.out.println(b);
     
    		// Ce qu'il y a après {etude}
    		String c = texte.substring(po+1,texte.length());
    		//System.out.println(c);
     
    		// On fais appel à la classe Classement
    		Classement cl = new Classement("C:\\Users\\ksmaili\\workspace\\voiture.xml"); 
    		//System.out.println(cl.getValueByKey(a)); // appel de la méthode getValueByKey
     
     
    	System.out.println(b.concat(cl.getValueByKey(a).concat(c)));
    		}
    //	}
     
    }
    En faite en sorti j'ai réussi a remplacer "nono" par "poli" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #----------------------------------------------------------------------
    ## Variables
    #----------------------------------------------------------------------
    #> hello
    d= "nono"_{gtr}_sylda_{BMW}"
    x = "{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/SS"
    y = "{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/EE"
    u = "{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/GT"
    u'  = "{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/UG"
    #< end 
    z=  caln#----------------------------------------------------------------------
    mais je dois boucler pour le reste !!! comment puis-je faire ? avez vous une petite astuce ?

    boucle while ou for ??

  2. #2
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Donc en gros
    - tu as un texte avec des "zones" qui contiendront des variables (une sorte de template)
    - tu as un fichier xml contenant les correspondance clé/valeur
    - tu veux faire le remplacement de toutes les clé de type {ma clé} par la valeur correspondante

    Si c'est ça, je pense que le plus simple serait de regarder vers les expressions régulières :
    Tu charges ton fichier contenant les associations clés/valeur
    Tu charges ton fichier texte
    Pour chaque clé, tu fais un remplacement avec une expression régulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String myText = ... // chargement du texte
       for (<boucle sur tes éléments clé/valeur>){
          myText = myText.remplaceAll("{" + key + "}", value);
       }

    (attention, ce code est gourmand en terme de ressource et de mémoire, mais il a l'avantage d'être court !)


    Après j'ai deux questions :
    - si ton fichier XML n'est qu'une liste d'association clé/valeur, pourquoi ne pas utiliser les Properties ou même un RessourceBundle ?
    - il va servir à quoi le fichier texte final avec les valeurs remplacées?




    Tu pourrais ensuite faire plus efficace en commençant par parcourir ton texte avec une expression régulière recherchant tout ce qui se présente sous la forme "{clé alphanumérique}", récupérer les clés, puis pour chaque clé faire la modification.
    Le pattern de recherche à utiliser est le suivant : "\\{(\\w+)\\}", et ensuite récupérer la valeur de groupe 1, ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    		String myText = ...// chargement de ton texte
    		Pattern pat = Pattern.compile( "\\{(\\w+)\\}");
    		Matcher m = pat.matcher(myText );
    		Set<String> keys = new HashSet<String>();
     
    		while (m.find()){ // recherche de toutes les clés
    			keys.add(m.group(1));
    		}
     
    		for (String key : keys){ // remplacement des clés
    		      myText = myText.remplaceAll("{" + key + "}", cl.getValueByKey(key));
    		}

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2014
    Messages : 180
    Par défaut
    Yoh

    oui j'ai :

    - un texte avec des "zones" qui contiendront les valeurs des clés( exemple : pupupu ( la valeur )a la place de gtr ( qui est la clé )
    - un fichier xml contenant les correspondance clé/valeur
    - Je veux faire le remplacement de toutes les clé de type {ma clé} par la valeur correspondante

    - si ton fichier XML n'est qu'une liste d'association clé/valeur, pourquoi ne pas utiliser les Properties ou même un RessourceBundle ?
    Je ne connaîs pas je suis débutant en JAVA
    - il va servir à quoi le fichier texte final avec les valeurs remplacées?
    C'est une petite partie d'un projet que je fais en tant que stagiaire en faite.

    sinon pour le code j'ai sa mais le i je le met en attribut par rapport a quoi ??

    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
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
     
    		  final String ZONE_B = "#>";
    		  final String ZONE_E = "#<";
    		  final String VALUE_B = "{";
    		  final String VALUE_E = "}";
     
    		String texte =  
    				 "#----------------------------------------------------------------------\n" +
    					        "#"+
    							"# Variables\n" +
    							"#----------------------------------------------------------------------\n" +
    							"#> hello\n" +
    							"d= \"{poli}_{gtr}_sylda_{BMW}\"\n" +
    							"x = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/SS\"\n" +
    							"y = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/EE\"\n" +
    							"u = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/GT\"\n" +
    							"u'  = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/UG\"\n" +
    							 "#< end \n" +
    							"z=  caln" +
    							"#----------------------------------------------------------------------\n";
    		// On fais appel à la classe Classement
    		Classement cl = new Classement("C:\\Users\\ksmaili\\workspace\\voiture.xml"); 
    		System.out.println(cl.getValueByKey(a)); // appel de la méthode getValueByKey
     
     
    		for (i=0; i >=0 ; i++){
     
    			texte = texte.remplaceAll("{" + key + "}", value);
     
    		}

  4. #4
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Citation Envoyé par khalous91 Voir le message
    Je ne connaîs pas je suis débutant en JAVA
    Tu devrais aller lire ce thread qui contient des solutions simples pour stocker des paires clés/valeurs avec des exemples : http://www.developpez.net/forums/d15...tres-d-classe/


    Pour ton code, actuellement, ça pourrait donner un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    		Classement cl = new Classement("C:\\Users\\ksmaili\\workspace\\voiture.xml"); 
     
                    Pattern pat = Pattern.compile( "\\{(\\w+)\\}");
    		Matcher m = pat.matcher(myText );
    		Set<String> keys = new HashSet<String>();
     
    		while (m.find()){ // recherche de toutes les clés dans le texte
    			keys.add(m.group(1));
    		}
     
    		for (String key : keys){ // remplacement des clés
    		      texte = texte.remplaceAll("{" + key + "}", cl.getValueByKey(key));
    		}
    Sinon, tu fais en sorte que ta classe Classement implémente Iterable<String>, tu implémentes la méthode iterator() dans ta classe Classement pour qu'elle renvoie un itérateur sur les clés de ton fichier clé/valeur, et refais la boucle autrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		Classement cl = new Classement("C:\\Users\\ksmaili\\workspace\\voiture.xml"); 
     
    		for (String key : cl){ parcours de toutes les clés connues
    		      texte = texte.remplaceAll("{" + key + "}", cl.getValueByKey(key));// remplacement des clés
    		}
    L'avantage de la deuxième solution c'est que tu n'essayeras pas de convertir des clés qui ne sont pas dans ton fichier de correspondance

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2014
    Messages : 180
    Par défaut
    D'accord
    merci pour les conseils
    sinon j'ai trouver ça et ça a l'air plus simple à comprendre mais plus long :

    code :
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    import java.util.HashMap;
     
    /**
     * Elle modifie tous les {keys} en {valeurs}
     * @author ksmaili
     *
     */
    public class Valeurkeys {
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
     
    		  final String ZONE_B = "#>";
    		  final String ZONE_E = "#<";
    		  final String VALUE_B = "{";
    		  final String VALUE_E = "}";
     
    		String texteRef = #----------------------------------------------------------------------
    ## Variables
    #----------------------------------------------------------------------
    #> hello
    d= "nono"_{gtr}_sylda_{BMW}"
    x = "{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/SS"
    y = "{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/EE"
    u = "{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/GT"
    u'  = "{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/UG"
    #< end 
    z=  caln#----------------------------------------------------------------------
     
     
    			int ao = 0;
    		 	int po = 0;
    		 	String texte = texteRef;
    			ao = texte.indexOf(VALUE_B,po);
    			po = texte.indexOf(VALUE_E,ao);
    			while(ao >= 0 && po >= 0){           
    				// Pour avoir les positions { et } 
     
    				System.out.println("position 1 : " +ao);
    				System.out.println("position 2 : " + po);
     
    				// ce qu'il y a entre { }
    				String a = texte.substring(ao+1, po);
    				System.out.println(a);
     
    				// Ce qu'il y a avant {etude}
    				String b = texte.substring(0, ao);
    				//System.out.println(b);
     
    				// Ce qu'il y a après {etude}
    				String c = texte.substring(po+1,texte.length());
    				//System.out.println(c);
     
    				// On fais appel à la classe Classement
    				Classement cl = new Classement("C:\\Users\\ksmaili\\workspace\\donnees.xml"); 
    				//System.out.println(cl.getValueByKey(a)); // appel de la méthode getValueByKey
     
     
    				//System.out.println(b.concat(cl.getValueByKey(a).concat(c)));
     
    				//System.out.println(cl.getValueByKey(a));
    				if (cl.getValueByKey(a) != null) {				
    					texte = b.concat(cl.getValueByKey(a).concat(c));
    				}
    				ao = texte.indexOf(VALUE_B,po);
    				po = texte.indexOf(VALUE_E,ao);
    			}
    		 	System.out.println(texte);
     
    	}
     
    }

  6. #6
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Pour le côte "plus simple à comprendre", j'ai envie de répondre : "heu... non..."

    Ton algo :
    - tu prends a0 et p0
    - tu prends texte tu mets texteRef dedans
    - dans a0 tu mets l'index de B en commençant par p0 (donc 0... donc pourquoi le préciser?)
    - dans p0 tu mets l'index de E en commençant par a0 (ok, là ça a un sens...)
    - Tant que a0 et p0 sont >=0 tous les deux :
    -- Récupérer ce qu'il y a entre ao+1 et p0 et on le met dans a
    -- Récupérer ce qu'il y a avant a0 et on le met dans b
    -- Récupérer ce qu'il y a après p0 et on le met dans c
    -- Récupérer le tableau de correspondance clé/valeur (tu pourrais le sortir de ta boucle pour le pas le recharger à chaque fois, mais passons)
    -- S'il existe une valeur correspondant à la clé (a)
    ---- Tu remplaces la valeur de texte par la concaténation de B (le début) + la valeur correspondant à la clé + C (la fin)
    -- dans a0 tu mets l'index de B en commençant par p0
    -- dans p0 tu mets l'index de E en commençant par a0


    Mon algo 1 :
    - Tu récupères ton tableau de valeur
    - Tu crée une règle regexp de recherche de l'expression : "Toute chaîne alphanumérique entre {}"
    - Tant que tu trouves des clés
    -- Tu ajoutes les clés à une liste unique des clés dans le texte
    - Pour toute les clés trouvées
    -- tu remplaces la clé par la valeur dans le texte

    Mon algo 2 :
    - Tu récupères ton tableau de valeur
    - Pour chaque clé dans le tableau, tu remplaces la clé par la valeur dans le texte


    La simplicité d'un code tient en deux choses :
    - il est court
    - il ne réinvente pas ce qui existe déjà

    La remplacement de chaîne dans un texte, c'est le boulot du code existant à ta disposition dans l'API. Soit un feignant intelligent !

Discussions similaires

  1. Une boucle pour associer X actions à X checkbox
    Par nicolas2603 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 17/10/2007, 15h05
  2. Réponses: 21
    Dernier message: 23/05/2007, 17h16
  3. je sais pas utilisé une boucle pour ?
    Par napz dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/10/2006, 02h09
  4. [ImageMagick] Une boucle pour ImageLine ?
    Par isa150183 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 26/11/2005, 19h41

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