string tokenizer

string tokenizer - Java - Programmation

Marsh Posté le 15-05-2003 à 04:09:52    

j'ai un fichier rech1.txt qui a dedans
 

Code :
  1. 7616
  2. 245484
  3. 68001
  4. 48094
  5. 207176
  6. 109156
  7. 61705
  8. 178895
  9. 39946
  10. 86435
  11. 96971
  12. 210439
  13. 102092
  14. 43927
  15. 106402
  16. 7616
  17. 4567
  18. 2629
  19. 2928
  20. 780
  21. 2728
  22. 2167
  23. 2412
  24. 2992
  25. 2251
  26. 2508
  27. 2835
  28. 2702
  29. 2714
  30. 2651
  31. 2976
  32. 2966
  33. 2096
  34. 2222
  35. 2136
  36. 2413

 
 
pour lire ce fichier je fais
 
 

Code :
  1. public void lirefichiertri(){
  2.     String NomFichier = "rech1.txt";
  3.     try{
  4.       BufferedReader in  = new BufferedReader(new FileReader(NomFichier));
  5.       String str = "test";
  6.       int i=0;
  7.       while (str != null) {
  8.         str = in.readLine();
  9.         StringTokenizer st = new StringTokenizer(str," " );
  10.         while(st.hasMoreTokens())
  11.           tab[i] = Integer.parseInt(st.nextToken());
  12.         System.out.println("Token lu = " + tab[i]);
  13.         i++;
  14.       }
  15.       in.close();
  16.     }
  17.     catch(Exception e){
  18.       e.printStackTrace();
  19.     }
  20.   }

 
 
avec ça j'obtiens
 
 

Code :
  1. Token lu = 7616
  2. Token lu = 245484
  3. Token lu = 68001
  4. Token lu = 48094
  5. Token lu = 207176
  6. Token lu = 109156
  7. Token lu = 61705
  8. Token lu = 178895
  9. Token lu = 39946
  10. Token lu = 86435
  11. Token lu = 96971
  12. Token lu = 210439
  13. Token lu = 102092
  14. Token lu = 43927
  15. Token lu = 106402
  16. Token lu = 7616
  17. Token lu = 4567
  18. Token lu = 2629
  19. Token lu = 2928
  20. Token lu = 780
  21. Token lu = 2728
  22. Token lu = 2167
  23. Token lu = 2412
  24. Token lu = 2992
  25. Token lu = 2251
  26. Token lu = 2508
  27. Token lu = 2835
  28. Token lu = 2702
  29. Token lu = 2714
  30. Token lu = 2651
  31. Token lu = 2976
  32. Token lu = 2966
  33. Token lu = 2096
  34. Token lu = 2222
  35. Token lu = 2136
  36. Token lu = 2413
  37. java.lang.NullPointerException
  38. at java.util.StringTokenizer.<init>(StringTokenizer.java:122)
  39. at java.util.StringTokenizer.<init>(StringTokenizer.java:138)
  40. at algo.lirefichiertri(algo.java:185)
  41. at algo.main(algo.java:222)

 
 
pourquoi ça ne fonctionne pas correctement


Message édité par okeefe le 15-05-2003 à 04:16:07
Reply

Marsh Posté le 15-05-2003 à 04:09:52   

Reply

Marsh Posté le 15-05-2003 à 05:54:46    

Ton tableau tab, tu l'initialises comment ?


---------------
Le site de ma maman
Reply

Marsh Posté le 15-05-2003 à 05:55:52    

De plus dans ton cas, y a vraiment, vraiment pas besoin d'un StringTokenizer. Un trim() suffit.


---------------
Le site de ma maman
Reply

Marsh Posté le 15-05-2003 à 06:06:45    

Cherrytree a écrit :

Ton tableau tab, tu l'initialises comment ?


 
private static int[] tab;
ensuite dans le constructeur...
 
tab = new int[11000];
 
et je ferais comment pour utilsier trim? de toute façon ça devrait pas régler mon problème...

Reply

Marsh Posté le 15-05-2003 à 06:18:23    

okeefe a écrit :


 
private static int[] tab;
ensuite dans le constructeur...
 
tab = new int[11000];
 
et je ferais comment pour utilsier trim? de toute façon ça devrait pas régler mon problème...


Un StringTokenizer c'est pour séparer une chaîne de caractères en tokens. Tu as choisi ' ' (espace) comme token, ce qui signifie que tu décomposes tes chaînes en mots, au sens commun du mot mot.
 
A partir de là, vu que ta chaîne est une ligne, donc un seul mot, ça n'a pas d'intérêt pour toi d'utiliser StringTokenizer. Tu fais juste :
 

Code :
  1. String line;
  2. int i = 0;
  3. while ((line = in.readLine()) != null) {
  4.     tab[i] = Integer.parseInt(line.trim());
  5.     ++i;
  6. }


Message édité par Cherrytree le 15-05-2003 à 06:19:54

---------------
Le site de ma maman
Reply

Marsh Posté le 15-05-2003 à 06:37:45    

merci ça fonctionne sans problème...
 
j'utilisait en fait un string tokeniser car j'ai une autre méthode semblable sauf qu'elle doit lire deux items par ligne...
 
le fichier à la structure:
 

Code :
  1. 588 val0588
  2. 2379 val2379
  3. 2498 val2498
  4. 2692 val2692
  5. 2281 val2281
  6. 897 val0897
  7. 787 val0787
  8. 211 val0211

 
 
mon code ressemble à l'ancien de l'autre:
 
 

Code :
  1. public void lirefichierrech(){
  2.     String NomFichier = "labo1test2.txt";
  3.     try{
  4.       BufferedReader in  = new BufferedReader(new FileReader(NomFichier));
  5.       String str = "test";
  6.       int i=0;
  7.       while (str != null) {
  8.         str = in.readLine();
  9.         StringTokenizer st = new StringTokenizer(str," " );
  10.         while(st.hasMoreTokens()){
  11.           tab[i] = Integer.parseInt(st.nextToken());
  12.           tabrech[i] = st.nextToken();
  13.          // System.out.println("Token lu = " + i);
  14.         }
  15.         i++;
  16.       }
  17.       in.close();
  18.     }
  19.     catch(Exception e){
  20.       e.printStackTrace();
  21.     }
  22.   }

 
 
je déclare les deux tableaux comme l'ancien...
 
j'obtient dans le même genre d'erreur que l'ancien
 

Code :
  1. java.lang.NullPointerException
  2. at java.util.StringTokenizer.<init>(StringTokenizer.java:122)
  3. at java.util.StringTokenizer.<init>(StringTokenizer.java:138)
  4. at algo.lirefichierrech(algo.java:214)
  5. at algo.main(algo.java:235)

 
 
je comprend pas pourquoi ça fonctionne pas

Reply

Marsh Posté le 15-05-2003 à 08:16:41    

bin tu as une erreur de design, tout simplement.
 
Tu testes si str n'est pas null, str n'est pas null ok tu rentres dans taboucle
 
et puis tu changes la valeur de str en faisant un readline !!! ca par contre ca peut renvoyer null et donc ton strinktokenizer se viande  
 
est ce clair?


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 15-05-2003 à 16:41:11    

DarkLord a écrit :

bin tu as une erreur de design, tout simplement.
 
Tu testes si str n'est pas null, str n'est pas null ok tu rentres dans taboucle
 
et puis tu changes la valeur de str en faisant un readline !!! ca par contre ca peut renvoyer null et donc ton strinktokenizer se viande  
 
est ce clair?


 
ça je l'avais compris, c'est plutôt la manière de corriger ça que sais pas comment je vais faire

Reply

Marsh Posté le 15-05-2003 à 16:44:38    

tin t'abuse ... c'est pas compliqué là !  
 
 

Code :
  1. public void lirefichierrech(){
  2.         String NomFichier = "labo1test2.txt";
  3.         try{
  4.             BufferedReader in  = new BufferedReader(new FileReader(NomFichier));
  5.             String str = in.readLine();
  6.             int i=0;
  7.             while (str != null) {
  8.                 StringTokenizer st = new StringTokenizer(str," " );
  9.                 while(st.hasMoreTokens()){
  10.                     tab[i] = Integer.parseInt(st.nextToken());
  11.                     tabrech[i] = st.nextToken();
  12.                    // System.out.println("Token lu = " + i);  
  13.                 }
  14.                 i++;         
  15.                 str = in.readLine();
  16.             }
  17.             in.close();
  18.         }
  19.         catch(Exception e){
  20.             e.printStackTrace();
  21.         }
  22.     }


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 15-05-2003 à 16:46:22    

cela dit tu me fais peur avec ton tab là ... Tu connais le nombre de token à l'avance? Si non soit tu alloues un tableau trop grand, soi tu te mange des arrayindexoutofboundexception ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 15-05-2003 à 16:46:22   

Reply

Marsh Posté le 15-05-2003 à 23:41:40    

puisque je sais pas combien de valeur que je lis, j'utilise un tableau dynamique

Code :
  1. private int[] tab=null;
  2.   public algo(){
  3.     tab = new int[]{};
  4.   }


 
je lis ensuite avec cette méthode
 
 

Code :
  1. public void lirefichiertri(){
  2.     String NomFichier = "rech1.txt";
  3.     try{
  4.       BufferedReader in  = new BufferedReader(new FileReader(NomFichier));
  5.       String line;
  6.         int i = 0;
  7.         while ((line = in.readLine()) != null) {
  8.               tab[i] = Integer.parseInt(line.trim());
  9.               //System.out.println("Token lu = " + tab[i]);
  10.         ++i;
  11.         }
  12.       in.close();
  13.     }
  14.     catch(Exception e){
  15.       e.printStackTrace();
  16.     }
  17.   }

 
 
j'obtiens l'erreur
 
java.lang.ArrayIndexOutOfBoundsException
 
en fait aussi que j'arrive à
tab[i] = Integer.parseInt(line.trim());  
ça saute au catch
 
pourtant si je met le tableau statique au lieu de dynamique j'obtien pas d'erreur


Message édité par okeefe le 15-05-2003 à 23:54:13
Reply

Marsh Posté le 16-05-2003 à 01:30:53    

okeefe a écrit :

puisque je sais pas combien de valeur que je lis, j'utilise un tableau dynamique

Code :
  1. private int[] tab=null;
  2.   public algo(){
  3.     tab = new int[]{};
  4.   }



:lol: [:rofl]  
 
 [:netbios]  excellente celle là !!!
 
bon, troll => [:nero27]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 16-05-2003 à 05:53:02    

[:rofl]  [:rofl]  [:rofl]


---------------
Le site de ma maman
Reply

Marsh Posté le 16-05-2003 à 05:58:56    

ben quoi on peut peu poser de question? :p

Reply

Marsh Posté le 16-05-2003 à 06:58:11    

okeefe a écrit :

ben quoi on peut peu poser de question? :p


C'est pas une raison pour bégayer et sortir des bétises. Les tableaux dynamiques c'est un peu plus compliqué que ça. ça se fait avec diverses classes comme ArrayList ou Vector. Ce que tu fais, c'est créer un tableau vide, sans allocation mémoire pour la moindre valeur. C'est normal que ton algo se plante. Il faudrait aussi comprendre ce qui a pu te faire penser que les tableaux dynamiques se créaient comme tu l'as fait.


---------------
Le site de ma maman
Reply

Marsh Posté le 16-05-2003 à 08:08:57    

:sweat:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 16-05-2003 à 20:32:03    

Cherrytree a écrit :


C'est pas une raison pour bégayer et sortir des bétises. Les tableaux dynamiques c'est un peu plus compliqué que ça. ça se fait avec diverses classes comme ArrayList ou Vector. Ce que tu fais, c'est créer un tableau vide, sans allocation mémoire pour la moindre valeur. C'est normal que ton algo se plante. Il faudrait aussi comprendre ce qui a pu te faire penser que les tableaux dynamiques se créaient comme tu l'as fait.


 
c'est pas des sotises, c'est des gens sur developpez.com qui m'ont dire de faire ça...
 
http://www.developpez.net/forums/viewtopic.php?t=81926

Reply

Marsh Posté le 16-05-2003 à 20:38:46    

[:rofl]
 
avant qu'un imbécile lache cette énormité, d'autres t'ont quand meme donné la réponse hein  :sarcastic:


Message édité par the real moins moins le 16-05-2003 à 20:39:53

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-05-2003 à 20:58:36    

the real moins moins a écrit :

[:rofl]
 
avant qu'un imbécile lache cette énormité, d'autres t'ont quand meme donné la réponse hein  :sarcastic:  


 
utiliser un vector, arraylist c'est quand même beaucoup moins performant qu'un tableau

Reply

Marsh Posté le 16-05-2003 à 20:59:19    

okeefe a écrit :


 
utiliser un vector, arraylist c'est quand même beaucoup moins performant qu'un tableau

non.
 
edit: et puis si tu preferes un truc qui compile pas c'est ton problème [:gratgrat]


Message édité par the real moins moins le 16-05-2003 à 20:59:47

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-05-2003 à 21:03:12    

okeefe a écrit :


 
utiliser un vector, arraylist c'est quand même beaucoup moins performant qu'un tableau


Pas tellement. Si tu savais comment est codé une ArrayList, tu te rendrais compte de ton erreur. D'autant que tu peux initialiser une ArrayList en spécifiant sa taille de départ.


---------------
Le site de ma maman
Reply

Marsh Posté le 16-05-2003 à 23:35:39    

fykman a écrit :

Essayes ca :
 

:sleep:  
on lui a deja fait faire tout ça. il sait pas initialiser un tableau [:spamafote]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 16-05-2003 à 23:39:07    

the real moins moins a écrit :

:sleep:  
on lui a deja fait faire tout ça. il sait pas initialiser un tableau [:spamafote]


 
Ouais j'ai vu apres, alors j'ai deleté.... :whistle:

Reply

Marsh Posté le 17-05-2003 à 14:04:05    

okeefe a écrit :


 
utiliser un vector, arraylist c'est quand même beaucoup moins performant qu'un tableau


tu veux un tableau qui s'aggrandit tout seul ... ca s'appelle une ArrayList.


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 17-05-2003 à 14:30:31    

Cherrytree a écrit :


Pas tellement. Si tu savais comment est codé une ArrayList, tu te rendrais compte de ton erreur. D'autant que tu peux initialiser une ArrayList en spécifiant sa taille de départ.


Dans l'absolu, je doute quand même.
OK, si c'est pour des utilisations de base, on voit pas la différence. Mais passer par des objets comme ArrayList (ou sa version synchronisée Vector) peut s'avérer beaucoup moins performante dans des cas d'utilisations très intensives.
J'ai utilisé OptimizeIt y a un peu plus d'un an pour des tests de perfos et franchement, niveau mémoire et CPU (sur des progs vraiment orientés tests hein, pas des applis) les tableaux d'objets natifs l'emportent haut la main. OK, ArrayList et HashMap c'est hyper pratique à coder, surtout dans le cadre de tableaux à taille variable, mais dire que c'est aussi performant dans l'absolu, je suis pas d'accord [:spamafote]


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 17-05-2003 à 14:32:04    

oui mais on s'en branle un peu des perfs :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 17-05-2003 à 15:02:16    

the real moins moins a écrit :

oui mais on s'en branle un peu des perfs :o


Ba moi j'répondais à la question sur les perfs [:ddr555]
Sinon, évidemment que dans la vie de tous les jours j'utilise ArrayList et HashMap (enfin, Vector et Hashtable passk'on a pas droit à 1.2 [:joce]), faire des System.arraycopy(), ça va 30 secondes.


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 17-05-2003 à 15:40:18    

Taiche a écrit :

mais dire que c'est aussi performant dans l'absolu, je suis pas d'accord [:spamafote]


c'est aussi performant que si il doit recoder lui même un tableau qui s'agrandit. Je crois que c'était ca qu'on voulait tous dire.
 
et comme le disait cherry, si il veut éviter le redimmensionnement, il a qu'à faire un new ArrayList(1000) et on en parle plus.


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 17-05-2003 à 17:48:04    

Benou a parfaitement vu ce que je voulais dire. Le seul problème que je vois avec une classe Collection, c'est qu'il faut utiliser des wrappers pour stocker les types primitifs. Mais pour le reste, c'est idéal.


---------------
Le site de ma maman
Reply

Marsh Posté le 17-05-2003 à 18:12:36    

types primitifs sucks :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 18-05-2003 à 00:49:06    

the real moins moins a écrit :

types primitifs sucks :o


Codeurs primitifs sucks.


---------------
Le site de ma maman
Reply

Marsh Posté le 18-05-2003 à 01:56:45    

Cherrytree a écrit :

Le seul problème que je vois avec une classe Collection, c'est qu'il faut utiliser des wrappers pour stocker les types primitifs.


 
dans son cas, il peut stocket les chaines et ensuite faire un deuxième passage pour transformer la collection de chaine en tableau de int


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed