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

Java ME Discussion :

Afficher une chaine de caractères dans un TextField


Sujet :

Java ME

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 34
    Points
    34
    Par défaut Afficher une chaine de caractères dans un TextField
    Bonjour,
    J'ai une "longue" chaine caractère de type :
    ID_1:Titre_1:Type Valeur_1:Ecriture_1: Valeur_1
    ID_:Titre_2:Type Valeur_2:Ecriture_2: Valeur_2
    ID_3:Titre_3:Type Valeur_3:Ecriture_3: Valeur_3
    ...
    Je voudrais le parcourir et pouvoir l'afficher dans un objet de type TextField. Y'a-t-il une fonction basée sur les string qui permet de parcourir la chaine sur le ":" et pouvoir indexée à tout moment le numéro de ligne?
    Ma proposition mais cela marche pas pour parcourir la chaine :

    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
     
     	/** Reenvoie le nombre de ligne de la liste des appareils. */
    	private int len(String list) {
    		int i = 0;
    		int cmpt = 0;
    		int chmp = 0;
    		String tmp = "";
    		while (i < list.length()) {
    			if (chmp > 5 ) {
    				while (list.substring(i) != ":") {
    					tmp += list.substring(i);
    					i++;
    				} chmp++;
     
    			}cmpt++;
    			chmp = 0; //Réinitialise le chmp;
    		}
    		return cmpt;
    	}

    Merci de votre aide.

  2. #2
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Salut,

    Je pense que la fonction Split() répond parfaitement à tes besoins.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String pattern = "Salut:les:amis";
    String[] resultat = pattern.split(":");
     
    // Donne {"Salut", "les", "amis"}
    Tu n'as ensuite plus qu'a boucler sur ton tableau et reconstruire ta chaine.

    Mais d'où sort cette chaine ? Car si elle sort d'un fichier tu peux très bien lire ligne par ligne, ce qui est d'autant plus simple

  3. #3
    Membre éprouvé
    Inscrit en
    Juin 2006
    Messages
    795
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 795
    Points : 1 270
    Points
    1 270
    Par défaut
    Salut,

    le problème, c'est qu'en JavaMe, il n'y a pas de split() (si je ne me trompe pas).

    Dans ce cas, il faut que tu implémentes toi-même la fonction.
    Un exemple sorti après 1 seconde de googlage (attention, je n'ai pas testé mais ça à l'air correct (mais je ne me prononce pas sur les perfs...)):

    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
    public static String[] Split(String splitStr, String delimiter) {
         StringBuffer token = new StringBuffer();
         Vector tokens = new Vector();
         // split
         char[] chars = splitStr.toCharArray();
         for (int i=0; i < chars.length; i++) {
             if (delimiter.indexOf(chars[i]) != -1) {
                 // we bumbed into a delimiter
                 if (token.length() > 0) {
                     tokens.addElement(token.toString());
                     token.setLength(0);
                 }
             } else {
                 token.append(chars[i]);
             }
         }
         // don't forget the "tail"...
         if (token.length() > 0) {
             tokens.addElement(token.toString());
         }
         // convert the vector into an array
         String[] splitArray = new String[tokens.size()];
         for (int i=0; i < splitArray.length; i++) {
             splitArray[i] = (String)tokens.elementAt(i);
         }
         return splitArray;
     }
    Source

  4. #4
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Autant pour moi j'avais pas vu le JavaME

  5. #5
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 34
    Points
    34
    Par défaut
    Merci Nico02 et Aniki,
    Effectivement, la fonction split() marche pas pour J2ME. Je vais tester pour la réponse de Aniki, je vous fais un retour le plutôt de ce que cela donne.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 34
    Points
    34
    Par défaut
    Bonjour,
    Il marche bien, mais si je renseigne à la fonction comme argument la chaine suivante :
    0x001:volets roulants:B:W:0
    0x002:machine a laver:B:W:0
    0x003:lumiere ext:B:W:0
    0x004:thermostat:I:W:18
    0x005:thermometre:I:R:19

    Il itére que jusqu'à 21 alors que c'est 25 element que j'ai ici delimité par ':'.
    Je comprend pas.

    Il y a quelque chose qui va pas avec la fonction. Vous avez une idée ?

  7. #7
    Membre éprouvé
    Inscrit en
    Juin 2006
    Messages
    795
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 795
    Points : 1 270
    Points
    1 270
    Par défaut
    Citation Envoyé par syneta Voir le message
    Bonjour,
    Il marche bien, mais si je renseigne à la fonction comme argument la chaine suivante :
    0x001:volets roulants:B:W:0
    0x002:machine a laver:B:W:0
    0x003:lumiere ext:B:W:0
    0x004:thermostat:I:W:18
    0x005:thermometre:I:R:19

    Il itére que jusqu'à 21 alors que c'est 25 element que j'ai ici delimité par ':'.
    Je comprend pas.

    Il y a quelque chose qui va pas avec la fonction. Vous avez une idée ?
    Quels sont les 21 éléments que tu as dans ton tableau ?
    Ca sera utile pour comprendre ce qui ne marche pas.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 34
    Points
    34
    Par défaut
    Bonjour Aniki,
    Par exemple pour la ligne (1ére ligne) : 0x001:volets roulants:B:W:0 ça marche bien :

    DEBUG : 0x001
    DEBUG : volets roulants
    DEBUG : B
    DEBUG : W
    DEBUG : 0

    Mais à partir des ligne suivantes (2ème et 5ème ligne) les chose deviennent étranges:

    0x002
    DEBUG : machine a laver
    DEBUG : B
    DEBUG : W
    DEBUG : 0
    0x003
    DEBUG : lumiere ext
    DEBUG : B
    DEBUG : W
    DEBUG : 0
    0x004
    DEBUG : thermostat
    DEBUG : I
    DEBUG : W
    DEBUG : 18
    0x005
    DEBUG : thermometre
    DEBUG : I
    DEBUG : R
    DEBUG : 19

    0x002, 0x003, 0x004 et 0x005 sont pas tenus en compte par une boucle, de telle sorte que j'aurais une exception "index out of bounds" au delà de 21 itérations.

    Une autre hypothèse la chaîne que je récupère n'est pas exactement à quoi elle ressemble, vu que je le récupère, si tu te souvient à partir d'une connexion HTTP. Il y a peut être des caractères (espace par exemple invisible). Oui c'est flou même pour moi!
    Je creuse encore en attendant.

  9. #9
    Membre éprouvé
    Inscrit en
    Juin 2006
    Messages
    795
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 795
    Points : 1 270
    Points
    1 270
    Par défaut
    La fonction marche à merveille !

    Si tu regardes bien ta chaîne, tu remarqueras qu'il y a 20 occurences du caractère ':'.
    20 occurences = 21 éléments

    Ton problème, c'est que tu as implicitement attendu que le split gère les retour charriots comme ton caractère de split.

    Pour obtenir le résultat que tu désires, il faut que tu fasses 2 splits : le premier split sur le retour charriot ('\n') et le second sur le point-virgule.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 34
    Points
    34
    Par défaut
    Bonjour Aniki,
    Desolé encore de te prendre ton précieux temps et ton aide qui me permet d'avancer.
    C'est parfait avec un Split sur le '\n' cela me facilité la tâche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    0x001:volets roulants:B:W:0
    0x002:machine a laver:B:W:0
    0x003:lumiere ext:B:W:0
    0x004:thermostat:I:W:18
    0x005:thermometre:I:R:19
    Mon objectif c'est d'afficher dans un StringItem ou TextField :
    Le nom de l'appareil et la valeur (dernier élement de chaque ligne). Exemple

    volet roulants, 0
    thermometre, 0
    etc...


    Je me disais si j'arrivais à organiser toute cette dans un tableau 2 dimension "étiqueté". Je ne sais pas trop si j2me permet de le faire, mais en java je pense que oui.

    Merci d'avance.

  11. #11
    Membre éprouvé
    Inscrit en
    Juin 2006
    Messages
    795
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 795
    Points : 1 270
    Points
    1 270
    Par défaut
    Citation Envoyé par syneta Voir le message
    Bonjour Aniki,
    Desolé encore de te prendre ton précieux temps et ton aide qui me permet d'avancer.
    Pas de problèmes.

    Tu veux afficher le nom de l'appareil et sa valeur une seule fois dans un TextField ou bien tu veux l'afficher mais aussi le conserver en mémoire ?

    Avec ce que tu sais actuellement, tu peux résoudre ton problème.

    Une fois que tu as fait le split sur le '\n', tu obtiens un tableau de String contenant chaque ligne.
    Pour afficher le nom et la valeur de chaque ligne, il te suffit de parcourir ce tableau dans une boucle. À chaque itération de la boucle, tu fais un split ':' sur la ligne (ce qui te donne un tableau de string contenant tous les éléments de la ligne en question) et tu affiches le deuxième et le cinquième éléments du tableau résultant du split ':'.

    Fais nous signe quand tu as du nouveau.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 34
    Points
    34
    Par défaut
    Bonsoir Aniki,
    Cela marche parfaitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private void formEtatPeripherique(String[] listApp) {
    		form = new Form ("ETAT DES APPAREILS");
    		String [] line = new String[listApp.length];
    		display = Display.getDisplay(this);
    		for (int i=0; i < listApp.length; i++) {
    			line = splitChariot(listApp[i],":");
    			StringItem item = new StringItem(line[1],", "+line[4]);
    			form.append(item);
    			}
            display.setCurrent(form);
     
    	}

  13. #13
    Membre éprouvé
    Inscrit en
    Juin 2006
    Messages
    795
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 795
    Points : 1 270
    Points
    1 270
    Par défaut
    Ca fait plaisir à entendre.

    Si tout va bien, tu peux donc passer la discussion en résolue.

  14. #14
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 34
    Points
    34
    Par défaut
    Merci Aniki pour ton temps qui a été si précieux. J'ai fini l'appli c'était un petit projet. Mais j'ai vachement beaucoup appris sur j2me. J'aimerais garder le contact, à très bientôt si cela te gène pas.


  15. #15
    Membre éprouvé
    Inscrit en
    Juin 2006
    Messages
    795
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 795
    Points : 1 270
    Points
    1 270
    Par défaut
    Pas de problèmes, je viens ici pour ça !
    Ca fait plaisir de voir qu'on peut aider.

    Je recommence à faire un tour régulièrement sur ce forum depuis peu.
    Si tu as des problèmes, je le verrai et j'essaierai de t'aider dans la mesure du possible.

    Bonne continuation.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/07/2008, 12h39
  2. Réponses: 7
    Dernier message: 20/04/2007, 16h42
  3. Récupérer une chaine de caractère dans une page
    Par BrunS dans le forum Langage
    Réponses: 3
    Dernier message: 15/11/2005, 14h28
  4. [String]Recherche d'une chaine de caractères dans une autre
    Par Crazyblinkgirl dans le forum Langage
    Réponses: 3
    Dernier message: 29/07/2004, 11h51
  5. recherche d'une chaine de caractère dans une données text
    Par jdeheul dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 17/06/2004, 16h35

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