Excusez moi je jouer au boulet mais je capte pas une erreur java ...

Excusez moi je jouer au boulet mais je capte pas une erreur java ... - Java - Programmation

Marsh Posté le 01-02-2003 à 17:24:16    

Exception in thread "main" java.lang.ClassCastException
 
je compren ke c un de mes cast ki merde mais cette erreur survient quand on essai de faire koi de mal ?
 
merci

Reply

Marsh Posté le 01-02-2003 à 17:24:16   

Reply

Marsh Posté le 01-02-2003 à 17:28:29    

Code :
  1. while(st.hasMoreElements())
  2.  {
  3.   EstDedan = false;
  4.   mot = (String)st.nextElement();
  5.   for(i=0;i<lex.size();i++)
  6.   {
  7.    EstDedan = (mot.equals(lex.get(i)));
  8.   }
  9.   if(!EstDedan)
  10.   {
  11.    sb = new StringBuffer(mot);
  12.    lex.add(sb);
  13.   }
  14.  }


 
le truc c a partir dun stringtokenziker créé en vector avec dedan les mot mais pas ajouté le redondan mon blem c ke :
EstDedan = (mot.equals(lex.get(i)));
revoi tjrs false et je c pas pk  :sweat:

Reply

Marsh Posté le 01-02-2003 à 17:30:51    

ca réponds pas a la question, mais en passant :
t'as pas besoin de caster en string pour utiliser .equals(), c'est une methode d'object

Reply

Marsh Posté le 01-02-2003 à 17:31:14    

a causede ta boucle: quand tu as trouve, faut sortir de la boucle, sinon estdedans quiv aut vrai risque d'etre mis a faux lors de la prochaine itération. donc rajoute un autre test dans la condition de ton for

Reply

Marsh Posté le 01-02-2003 à 17:31:50    

Tu compares des String à des StringBuffer, pourquoi donc ? [:zebra33]
 
C'est Taz qui a la solution, en revanche, je ne comprends toujours pas pourquoi tu ajoutes des StringBuffer dans ton Vector et pas des String toutes bêtes.


Message édité par Cherrytree le 01-02-2003 à 17:33:22

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

Marsh Posté le 01-02-2003 à 17:32:29    

++Taz a écrit :

a causede ta boucle: quand tu as trouve, faut sortir de la boucle, sinon estdedans quiv aut vrai risque d'etre mis a faux lors de la prochaine itération. donc rajoute un autre test dans la condition de ton for


Bien vu !


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

Marsh Posté le 01-02-2003 à 17:33:29    

Cherrytree a écrit :

Tu compares des String à des StringBuffer, pourquoi donc ? [:zebra33]  


 
ué jvien dle voir
now ca pass :
 

Code :
  1. public static void ajouter(Vector lex, StringTokenizer st)
  2. {
  3.  int i;
  4.  String mot;
  5.  StringBuffer sb;
  6.  boolean EstDedan;
  7.  String m;
  8.  while(st.hasMoreElements())
  9.  {
  10.   EstDedan = false;
  11.   mot = (String)st.nextElement();
  12.   for(i=0;i<lex.size();i++)
  13.   {
  14.    m = (lex.get(i)).toString();
  15.    EstDedan = (mot.equals(m));
  16.   }
  17.   if(!EstDedan)
  18.   {
  19.    sb = new StringBuffer(mot);
  20.    lex.add(sb);
  21.   }
  22.  }
  23. }


 
prochaine étape les trié en ordre alphabétik :D

Reply

Marsh Posté le 01-02-2003 à 17:34:54    

+1 pourquoi des StringBuffer?

Reply

Marsh Posté le 01-02-2003 à 17:35:36    

c toujours pas bon....

Reply

Marsh Posté le 01-02-2003 à 17:37:11    

++Taz a écrit :

a causede ta boucle: quand tu as trouve, faut sortir de la boucle, sinon estdedans quiv aut vrai risque d'etre mis a faux lors de la prochaine itération. donc rajoute un autre test dans la condition de ton for


 
rololo sui a la mass :(
 

Code :
  1. public static void ajouter(Vector lex, StringTokenizer st)
  2. {
  3.  int i;
  4.  String mot;
  5.  StringBuffer sb;
  6.  boolean EstDedan;
  7.  String m;
  8.  while(st.hasMoreElements())
  9.  {
  10.   EstDedan = false;
  11.   mot = (String)st.nextElement();
  12.   i=0;
  13.   while((i<lex.size()) && (!EstDedan))
  14.   {
  15.    m = (lex.get(i)).toString();
  16.    EstDedan = (mot.equals(m));
  17.    i++;
  18.   }
  19.   if(!EstDedan)
  20.   {
  21.    sb = new StringBuffer(mot);
  22.    lex.add(sb);
  23.   }
  24.  }
  25. }


 
thx

Reply

Marsh Posté le 01-02-2003 à 17:37:11   

Reply

Marsh Posté le 01-02-2003 à 17:37:50    

Deux choses :
* ici, c'est pas un SMS ou un chat, tu peux écrire autant de lettres que tu veux, c'est la fête ! Donc si tu pouvais éviter "d'écrir kom ça", ça serait bien pour tout le monde, merci :jap:  
* Java c'est bien mais à ta place et pour plus de lisibilité, je déclarerais mes variables du genre : StringBuffer sb = new StringBuffer();
En gros, mets le type de ta variable devant son nom comme ça on sait en un coup d'oeil à quoi ça correspond (d'ailleurs, je savais même pas que c'était possible de faire autrement :D).
 
Enfin et surtout, j'ai pas très bien compris ton problème [:ddr555] Tu pourrais sortir la trace de l'Exception ou dire à quelle ligne elle se réfère, steuplé ?
 
EDIT : roh putain, 5 min au phone et chu grillaid 2000 fois [:ruisseau de larmes]


Message édité par Taiche le 01-02-2003 à 17:38:35
Reply

Marsh Posté le 01-02-2003 à 17:38:42    

tu pouvais laisser un for, y a pas de mal. ca serait d'aillerus peut etre plus lisible, surtout en initialisant estdedans=false dans le premier statement du for

Reply

Marsh Posté le 01-02-2003 à 17:40:04    

comme dit taiche, oublie le pascal: déclare tes varaibles au plus pres de leur initialisation

Reply

Marsh Posté le 01-02-2003 à 17:47:26    

++Taz a écrit :

comme dit taiche, oublie le pascal: déclare tes varaibles au plus pres de leur initialisation


 

Code :
  1. while(st.hasMoreElements())
  2.  {
  3.   mot = (String)st.nextElement();
  4.   for(i=0,EstDedan=false; (i<lex.size()) && (!EstDedan) ;i++)
  5.   {
  6.    m = (lex.get(i)).toString();
  7.    EstDedan = (mot.equals(m));
  8.   }
  9.   if(!EstDedan)
  10.   {
  11.    sb = new StringBuffer(mot);
  12.    lex.add(sb);
  13.   }
  14.  }


 
pr son exemple j'avai pas tro le choi ... je cré le stringbuffer ke kan je suis sur ke je le mot rentre ds le vector

Reply

Marsh Posté le 01-02-2003 à 17:50:33    

EpoK a écrit :


pr son exemple j'avai pas tro le choi ... je cré le stringbuffer ke kan je suis sur ke je le mot rentre ds le vector


 
Ouais non mais c'que je veux dire c'est qu'il ne faut pas écrire

Code :
  1. sb = new StringBuffer();


 
mais plutôt :

Code :
  1. StringBuffer sb = new StringBuffer();

Reply

Marsh Posté le 01-02-2003 à 17:53:08    

EpoK a écrit :


pr son exemple j'avai pas tro le choi ... je cré le stringbuffer ke kan je suis sur ke je le mot rentre ds le vector


 
déclaration != instanciation

Reply

Marsh Posté le 01-02-2003 à 17:54:28    

Taiche a écrit :


 
Ouais non mais c'que je veux dire c'est qu'il ne faut pas écrire

Code :
  1. sb = new StringBuffer();


 
mais plutôt :

Code :
  1. StringBuffer sb = new StringBuffer();




 
ok
 
mais là j'écrit sb = new StringBuffer(mot), je peu pas trop le faire avant d'avoir mot :)
 

Reply

Marsh Posté le 01-02-2003 à 17:55:48    

EpoK a écrit :


mais là j'écrit sb = new StringBuffer(mot), je peu pas trop le faire avant d'avoir mot :)


 
mais rien ne t'empeche de ne déclarer sb que dans ton if, plutot qu'en tete de fonction  [:sinclaire]

Reply

Marsh Posté le 01-02-2003 à 17:55:49    

mais bordel, déclare tes varaibles la ou tu en as besoin et pas dans un bloc massif a chaque nouvelle fonction  :bounce:  :D

Reply

Marsh Posté le 01-02-2003 à 17:58:43    

ouais  :sweat:

Reply

Marsh Posté le 01-02-2003 à 18:03:50    

peut etre que tu ferais bien de changer le types de lex ou de l'ordonner, par ce que la recherche linéaire, c'est pas top.
 
personnellement, moi je penserais à un Set
 
http://java.sun.com/j2se/1.4/docs/ [...] l/Set.html
 
ton traitement serait alors
 

Code :
  1. public static void ajouter(TreeSet lex, StringTokenizer st)
  2. {
  3. while(st.hasMoreElements())
  4. {
  5.   lex.add(new StringBuffer((String)st.nextElement());
  6. }
  7. }

 

Reply

Marsh Posté le 01-02-2003 à 18:36:48    

++Taz a écrit :

peut etre que tu ferais bien de changer le types de lex ou de l'ordonner, par ce que la recherche linéaire, c'est pas top.
 
personnellement, moi je penserais à un Set
 
http://java.sun.com/j2se/1.4/docs/ [...] l/Set.html
 
ton traitement serait alors
 

Code :
  1. public static void ajouter(TreeSet lex, StringTokenizer st)
  2. {
  3. while(st.hasMoreElements())
  4. {
  5.   lex.add(new StringBuffer((String)st.nextElement());
  6. }
  7. }

 
 


 
hum hum jai pas encore vu cette class
 
v jeté un oeil merci

Reply

Marsh Posté le 03-02-2003 à 12:40:31    

EpoK a écrit :


 

Code :
  1. (...)
  2. for(i=0,EstDedan=false; (i<lex.size()) && (!EstDedan) ;i++)
  3. {
  4. m = (lex.get(i)).toString();
  5. EstDedan = (mot.equals(m));
  6. }
  7. (...)




Taz> Désolé de te contredire, mais normalement, le "for" ne doit être utilisé que quand on connait à l'avance le nombre d'itérations. Sinon, il  perd énormément de sa lisibilité, et il vaut beaucoup mieux utiliser "while".
 
Epok> Comme l'a dit lorill en tout début du topic, equals() s'invoque sur un Object et attend un Object en argument. Donc tu peux écrire :

Code :
  1. EstDedan = lex.get(i).equals(mot);


ou

Code :
  1. EstDedan = mot.equals(lex.get(i));


Et puis, en français, "dedans" prend un 's' final... :D
 
Enfin, à mon avis, il n'a pas besoin de booléen ici :

Code :
  1. List  lex     = ...;
  2. (...)
  3. int   numMots = lex.size();
  4. while (st.hasMoreElements()) {
  5.     Object  mot = st.nextElement();
  6.     int     i   = numMots;
  7.     while (i >= 0  &&  !mot.equals(lex.get(i))) {
  8.         i--;
  9.     }
  10.     // Pas trouve
  11.     if (i < 0) {
  12.         lex.add(new StringBuffer(mot));
  13.         numMots++;
  14.     }
  15. }


Maintenant, 2 choses :

  • A moins que tu aies besoin que plusieurs threads accèdent en même temps ton vecteur "lex", n'utilise pas "java.util.Vector", mais "java.util.ArrayList", c'est préférable. Dans tous les cas, ne déclare ton objet "lex" que comme une "java.util.List". Ca pourra être utile à l'avenir.
  • Si tu veux trier "lex", je te conseille de regarder du côté de "java.util.Collections.binarySearch(java.util.List list, Object key)". Tu pourras l'utiliser aussi bien pour trouver que pour insérer au bon endroit...

Reply

Marsh Posté le 03-02-2003 à 14:11:28    

BifaceMcLeOD a écrit :


Taz> Désolé de te contredire, mais normalement, le "for" ne doit être utilisé que quand on connait à l'avance le nombre d'itérations. Sinon, il  perd énormément de sa lisibilité, et il vaut beaucoup mieux utiliser "while".


 
 :heink: étant donné que ici le parcours est fait par index, le for me parait au contraire sémantiquement plus correcte et plus lisible qu'un while avec une variable index initialisée on ne sait ou

Reply

Marsh Posté le 03-02-2003 à 14:16:14    

Tout dépend de quoi on parle : du "for" C ou du "for" algorithmique. Parce que je te rappelle qu'en algorithmique pure, le "for" s'écrit :

for i in [value1, value2] loop ...


Il n'est donc pas question de pouvoir y loger une autre condition que "i < value2"...

Reply

Marsh Posté le 03-02-2003 à 17:11:50    

c'est bon là j'ai plus besoin de while ni de for, falai juste trouvé la bonne méthode dans la doc ... ;)
 

Code :
  1. public static void ajouter(Vector lex, StringTokenizer st)
  2. {
  3.  int i;
  4.  boolean EstDedan;
  5.  String mot;
  6.  String motvector;
  7.  while(st.hasMoreElements())
  8.  {
  9.   mot = (String)st.nextElement();
  10.   EstDedan=false;
  11.   EstDedan=lex.contains(mot);
  12.   if(!EstDedan)
  13.   {
  14.    lex.add(mot);
  15.   }
  16.  }
  17. }

Reply

Marsh Posté le 03-02-2003 à 18:41:06    

EpoK a écrit :

 boolean EstDedan;


les variables avec des une majuscule au début ca sux !

Reply

Marsh Posté le 03-02-2003 à 19:30:14    

benou a écrit :


les variables avec des une majuscule au début ca sux !


Ouais ça c'est la convention MS.


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

Marsh Posté le 04-02-2003 à 14:28:59    

Oui, et puis, il y a des lignes de code inutiles ici.
A quoi ça sert par exemple d'initialiser "EstDedan" puisqu'à l'instruction suivante, tu lui affectes de toute façon une valeur ? Et à quoi servent "i" et "motvecteur" ?
 
Par ailleurs, Vector, comme sa superclasse List, contient des instances d'Object, pas de String, donc il est inutile de caster le retour de nextElement() en String (ou alors utilise la méthode nextToken(), qui te renvoie directement une instance de String).
Rappelle-toi qu'un cast alourdit l'écriture et n'est jamais gratuit à l'exécution en Java. Alors autant les éviter lorsqu'ils sont inutiles.
 
En fait, je te suggère plutôt d'écrire :

Code :
  1. public static void ajouter(Vector lex, StringTokenizer st) {
  2.   while (st.hasMoreElements()) {
  3.     Object  mot = st.nextElement();
  4.     if (!lex.contains(mot)) {
  5.       lex.add(mot);
  6.     }
  7.   }
  8. }


Tu noteras que ce code est strictement équivalent au tien, mais il ne contient que le code nécessaire. Or moins de lignes de code, c'est d'autant de moins de code à maintenir ensuite.


Message édité par BifaceMcLeOD le 04-02-2003 à 14:30:16
Reply

Marsh Posté le 04-02-2003 à 14:36:23    

et temps qu'à faire, autant utiliser un Set puisque c'est ca que tu veux (HashSet par exemple).
 

Code :
  1. public static void ajouter(Set lex, StringTokenizer st) {
  2.    while (st.hasMoreElements()) {
  3.       lex.add(st.nextElement());
  4.    } 
  5. }


 
en plus ce sera plus rapide ...

Reply

Marsh Posté le 04-02-2003 à 16:03:34    

Yup !  :jap:

Reply

Marsh Posté le 04-02-2003 à 17:39:48    

benou a écrit :

et temps qu'à faire, autant utiliser un Set puisque c'est ca que tu veux (HashSet par exemple).
 

Code :
  1. public static void ajouter(Set lex, StringTokenizer st) {
  2.    while (st.hasMoreElements()) {
  3.       lex.add(st.nextElement());
  4.    } 
  5. }


 
en plus ce sera plus rapide ...

ce que j'ai déjà proposé 1 miyion de posts auparavant. mais moi j'aurais plutot dit un SortedSet (TreeSet)

Reply

Marsh Posté le 04-02-2003 à 17:51:37    

++Taz a écrit :

ce que j'ai déjà proposé 1 miyion de posts auparavant. mais moi j'aurais plutot dit un SortedSet (TreeSet)


ha oui tiens ...
 
pourquoi un TreeSet ?
c'est plus lent et ca a juste un intérêt si tu veux ordonner la collection ...

Reply

Marsh Posté le 04-02-2003 à 18:07:05    

ben je sais pas :D, histoire de montrer que ça existe et peut etre pour faire une démo. pi faut voir que c'est souvent plus facile de faire une fonction de comparaison qu'une bonne fonction de hashage

Reply

Marsh Posté le 04-02-2003 à 18:09:19    

ok mais bon, la c'est des String. Elle est déjà tout faite la fonctione de hashage  :o  
 
:)

Reply

Marsh Posté le 04-02-2003 à 18:18:07    

tout en effet

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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