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

Collection et Stream Java Discussion :

Problème avec StingTokenizer vers tableau de String [Débutant(e)]


Sujet :

Collection et Stream Java

  1. #1
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 211
    Points : 102
    Points
    102
    Par défaut Problème avec StingTokenizer vers tableau de String
    Bonjour,

    Voilà j'ai créé un nouveau StringTokenizer avec donc un message en String et un délimiteur genre "#".

    Ce que je voudrais c'est pouvoir récupérer dans un tableau de String, chaque chaine de caractères de ce message présente entre les délimiteurs. J'ai donc le code qui suit :

    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
    int i = 0;
    		try {
    			tokenToGetField = new StringTokenizer(message, delimiter);
    			while(tokenToGetField.hasMoreTokens() == true)
    			{				
    				String temp;
    				temp = tokenToGetField.nextToken();
    				fields[i] = temp;
    				System.out.println(fields[i]);
    				i++;
    			}
    		}catch(NoSuchElementException e)
    			{ System.out.println("Error n°1 when we want to get a field from the message"); }
    		catch (NullPointerException ee)
    			{ System.out.println("Error n°2 when we want to get a field from the message"); }
    Ca me créer une exeption du NullPointerException et je ne comprend pas pourquoi...

    Si je change le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while(tokenToGetField.hasMoreTokens() == true)
    			{				
    				String temp;
    				temp = tokenToGetField.nextToken();
    				fields[i] = temp;
    				System.out.println(fields[i]);
    				i++;
    			}
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(tokenToGetField.hasMoreTokens() == true)
    			{				
    				System.out.println(tokenToGetField.nextToken());
    			}
    Là je n'ai plus de problème, ça s'affiche bien...


    Une idée ?

    Merci pour l'aide

  2. #2
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 79
    Points : 53
    Points
    53
    Par défaut
    pk ce compliquer la vie ?
    La fonction Split() de String semble faire ce que tu veux si j'ai bien compris.
    http://java.sun.com/j2se/1.4.2/docs/...Tokenizer.html
    donne un exemple de l'utilisation de Split.

    Ensuite j'ai fais ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public static void main(String args[]) 
    	{
    		StringTokenizer tokenToGetField = new StringTokenizer("totot#trtrtr#","#");
    		String[] fields=new String[10];
    		int i=0;
    		while(tokenToGetField.hasMoreTokens())
    		{				
    			String temp;
    			temp = tokenToGetField.nextToken();
    			fields[i] = temp;
    			System.out.println(fields[i]);
    			i++;
    		}
    	}
    Ca marche nikel. Le soucis c'est que tu utilises un tableau. Tu es obligé de connaitre la taille de ton tableau avant de le remplir.
    Si tu ne peux pas connaitre la taille avant, autant utiliser une liste.

    ++

  3. #3
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Où est initialisé le tableau fields[] ?
    De quelle ligne vient l'erreur (affiche la trace de l'exception) ?
    Pourquoi ne pas utiliser la méthode split() de la classe String ? [edit] grilled [/edit]
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  4. #4
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    Bon je fais vite avec de me faire sortir avec un coup de pied au derrière ...

    J'avais oublié d'initialiser le tableau...

    Merci à vous 2 pour votre aide si rapide

    Par contre, le fait d'utiliser String et sa méthode Split c'est mieux (plus rapide) que d'utiliser un StringTokenizer ?

  5. #5
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Citation Envoyé par nicofromChina
    Bon je fais vite avec de me faire sortir avec un coup de pied au derrière ...

    J'avais oublié d'initialiser le tableau...

    Merci à vous 2 pour votre aide si rapide

    Par contre, le fait d'utiliser String et sa méthode Split c'est mieux (plus rapide) que d'utiliser un StringTokenizer ?
    Si la finalité c'est d'obtenir un tableau de String alors autant utiliser le split, y'a besoin de moins de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String[] fields= "totot#trtrtr#".split("#");
    équivalent à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    StringTokenizer tokenToGetField = new StringTokenizer("totot#trtrtr#","#");
    String[] fields=new String[10];
    int i=0;
    while(tokenToGetField.hasMoreTokens())
    {				
    	String temp;
    	temp = tokenToGetField.nextToken();
    	fields[i] = temp;
    	System.out.println(fields[i]);
    	i++;
    }
    C'est quand même plus court, non?

    Par contre, attention quand tu exprime le délimiteur en paramètre de split car split utilise les expressions régulières.

    En performance pure, il doit pas y avoir une différence flagrante entre les 2, surtout pour un motif aussi simple.

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  6. #6
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    Bonsoir.

    Une ptite question concernant split. Le délimiteur peut il contenir n'importe quel caractère ? Car j'ai des problème lorsque j'utilise une chaine de caractères comme délimiteur, contenant par exemple un "\" ou "*" ou "$" ...


    EDIT : ok Descent je viens de relire la fin de ton message. J'ai regardé dans le tuto que tu m'a donné, et j'en déduit que je ne peux pas les utiliser. Il n'y a vraiment aucun moyen ?

  7. #7
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    '\', '*' et '$' font partie des caractères réservés des expressions régulières (plus d'info dans la javadoc de la classe Pattern).

    Pour les utiliser en temps que caractère propre tu dois les échapper avec le caractère '\' (voir aussi Pourquoi dois-je doubler/quadrupler le caractère anti-slash ('\') ?).
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  8. #8
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    Ok merci pour la réponse mais j'ai essayé avec 4 "\" devant le "$" ça ne marche pas

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String[] fields= "Hi.#$///#How are you?#$///#".split("#\\\\$///#");
    System.out.println(fields[1]);
    ne marche pas. A moins que ça soit moi qui me plante dans le code...

  9. #9
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Le quadruple '\' c'est pour échapper le caractère '\'.

    Le plus simple c'est d'y aller pas à pas.
    Il faut commencer par écrire tes expressions régulières normalement (sans te préocupper du doublage des '\').

    Si par exemple tu veux utiliser le séparateur "#$///#". Cette chaine de caractères contient '$' qui est un caractère réservé pour les expressions régulières, il faut donc l'échapper avec le caractère '\' ce qui donne "#\$///#".

    Imaginons maintenant que tu veuille utiliser le séparateur "#\///#". Comme pour le '$' précédent, le '\' est un caractère réservé pour les expressions régulières (comme tu l'as sans doute remarqué, il s'agit du caractère d'échappement), il faut donc l'échapper (toujours avec '\'). Ce qui donne "#\\///#".

    Tu as donc les expressions régulières "#\$///#" et "#\\///#".
    Tu veux maintenant les écrires dans ton code java, or en java (comme dans beaucoup de langage) les '\' sont aussi des caractères d'échappements.
    Donc si tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String regex1 = "#\$///#";
    String regex2 = "#\\///#";
    les '\' seront considéré par java comme des caractères d'échappement et non comme des caractères appartenants à ton expression régulière. Il te faut encore une fois échapper tous les '\'.
    Ce qui te donne au final
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String regex1 = "#\\$///#";
    String regex2 = "#\\\\///#";
    Pour résumé, quand tu as un séparateur qui contient un caractère "X" réservé aux expressions régulières, il se transforme en "\\X" dans ton expression régulière. Sauf pour le caractère "\" qui lui se transforme en "\\\\".
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  10. #10
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    Ok merci le y@m's pour ton explication, c'est simpa et j'ai pigé :p

    Allez j'y retourne.

    Bye

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

Discussions similaires

  1. Problème avec type et tableau
    Par semaj_james dans le forum Ada
    Réponses: 2
    Dernier message: 21/02/2007, 15h31
  2. Problème avec Excel et tableau croisé dynamique
    Par françois62 dans le forum VBScript
    Réponses: 9
    Dernier message: 19/11/2006, 22h17
  3. Problème avec un switch contenant des strings
    Par dessinateurttuyen dans le forum Langage
    Réponses: 6
    Dernier message: 18/07/2006, 12h56
  4. Problème avec RegEx et une Query string
    Par Erakis dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2005, 15h48

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