SVP aidez moi

noussa1985 Messages postés 31 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 20 avril 2008 - 1 avril 2008 à 20:47
 Utilisateur anonyme - 3 avril 2008 à 06:40
Bonsoir,
Je suis débutante en java,je developpe une méthode qui permet de comparer les elements(String) d'un  Vecteur :

public Vector compare( String trans,String elt, String type) throws FileNotFoundException{
        Vector v=this.initialisation(); //la methode initialisation( ) retourne le vecteur v qui va contenir 3 elements séparées par ':' ou le                                                     //dernier elt est toujours "INITIAL" exp:"1:45:INITIAL"

                                                                                        //    "1:1200:INITIAL"

                                                                                         //    "3:45:INITIAL"                                                 
        for(int i=0;i<v.size();i++){
            String line=(String) v.get(i);
            StringTokenizer tok=new StringTokenizer(line,":");
            String code=tok.nextToken();
            if(code.equals(transac)){
                String t=tok.nextToken();
                if((t.equals(elt))){
                    String typeN=tok.nextToken();
                    typeN=type;              
               }
        }          
     }
        return v;
    }

La methode compare( ) doit normalement retourner un vecteur dont  les derniers elts aprés ':' vont etre changé si le 1er et le 2eme elt se trouvent ds le vecteur v initial.
Exp:
public static void main(String[] args) {
          Classe c=new Classe();
            Vector v=c.compare("3","50","IND");
            for(int i=0;i<v.size();i++){
                String s=(String) v.elementAt(i);
                System.out.println("ligne="+s);
            }
}
l'affichage doit remplacer le type "initial" du vecteur initial par le type "IND" dans l'elt n° 3 et de qté =50 mais le probleme et que le type reste toujour "INITIAL" et n'st pas remplacé par "IND"
SVP aidez moi je trouve pas l'erreur je pense que ça doit fonctionne bien

4 réponses

Utilisateur anonyme
2 avril 2008 à 08:17
Bonjour

C'est ça qui ne marche pas :

String typeN=tok.nextToken();
typeN=type;  

Il faut plutôt faire :
v.remove(i);
v.add(i,"code"+":"+t+":"+type);

Ca va poser un autre problème alors il faut que tu fasses ça aussi :
int nSize =
v.size();


for(int i=0;i<nSize;i++)

Ce que tu avais fait ne changeait que la valeur d'une variable locale, pas la chaîne dans le vecteur. A l'avenir, essaie de mieux déboguer, d'afficher des traces pour voir ce qui se passe.


TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
Utilisateur anonyme
2 avril 2008 à 08:19
Je précise que ton code est très sale et pas du tout optimal. Tu pourrais utiliser la méthode split de la classe String plutôt que StringTokenizer. Ca ne sert à rien de déclarer les variables comme tu le fais. Tu es débutante et c'est aussi en tenant compte des remarques qu'on te fait que tu pourras progresser.

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
noussa1985 Messages postés 31 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 20 avril 2008
2 avril 2008 à 23:13
Merci bien gouesse pour votre aide  et pour les remarques que vous m'avez donné,en faite je suis réellement debutante et j'ai besoin de tous vos aides et vos commentaires pour que je puisse progresser.

J'ai utilisé la methode solit( ) comme vous m'avez dit et etait plus simple.
for(int i= 0;i<v.size();i++){
            String line=(String) v.get(i);
            String[] apresSplit = line.split(":");           
            if((apresSplit[0].equals(transac))&&((apresSplit[1].equals(elt)))){           
                    v.remove(i);                   
                    v.add(i,transac+":"+elt+type);                   
            }
        }
        return v;

Mais je veux savoir puisque j'avais aucune idée sur split() et mnt j'ai quelques notions,est ce que toujours split( ) est plus performante que StringTokenizer ???

Dans tous la suite de mon code j'ai toujours utilisé StringTokenizer,et je veux prendre ton avi puisque vous etes expert de java:
j'ai un fichier dont chaque ligne est ss lcette forme: 1 25 3 , 5 6 : 56 =7 8 99 ,je veux avoir ts les elts avant ',' seuls;les elts avant ':' seuls ; les elts avant ' =' seuls et finalement les elts apres '=' seuls.
Comme je vous l'ai dit avant que j'ai utilisé StringTokenizer, que pensez vous???

NB:SVP si vous avez un titurial ou un lien de site qui peut m'aider à plus comprendre split( ) et de savoir ses performances me
        le donner.
Merci
0
Utilisateur anonyme
3 avril 2008 à 06:40
Bonjour

Il fut un temps où Sun voulait rendre StringTokenizer deprecated... A ma connaissance, split(...) est plus performant. Cependant, si une partie de ton code marche bien avec StringTokenizer, ce n'est peut-être pas nécessaire de tout changer. Ce serait mieux mais il ne faut pas que ça casse ce que tu as réussi à mettre au point. Au niveau client, l'amélioration de performance ne sera pas nécessairement perceptible.

Le meilleur lien reste la documentation Java, voici ce qu'elle dit sur split(...) :

public String[] split(String regex,
int limit)

Splits this string around matches of the given
regular expression.

The array returned by this method contains each substring of this
string that is terminated by another substring that matches the given
expression or is terminated by the end of the string. The substrings in
the array are in the order in which they occur in this string. If the
expression does not match any part of the input then the resulting array
has just one element, namely this string.

The <tt>limit</tt> parameter controls the number of times the
pattern is applied and therefore affects the length of the resulting
array. If the limit n is greater than zero then the pattern
will be applied at most n - 1 times, the array's
length will be no greater than n, and the array's last entry
will contain all input beyond the last matched delimiter. If n
is non-positive then the pattern will be applied as many times as
possible and the array can have any length. If n is zero then
the pattern will be applied as many times as possible, the array can
have any length, and trailing empty strings will be discarded.

The string <tt>\"boo:and:foo\"</tt>, for example, yields the
following results with these parameters:

<gras>Regex |Limit |Result |----
:, 2, <tt>{ \\"boo\\", \\"and:foo\\" }</tt>, ----
:, 5, <tt>{ \\"boo\\", \\"and\\", \\"foo\\" }</tt>, ----
:, -2, <tt>{ \\"boo\\", \\"and\\", \\"foo\\" }</tt>, ----
o, 5, <tt>{ \\"b\\", \\"\\", \\":and:f\\", \\"\\", \\"\\" }</tt>, ----
o, -2, <tt>{ \\"b\\", \\"\\", \\":and:f\\", \\"\\", \\"\\" }</tt>, ----
o, 0, <tt>{ \"b\", \"\", \":and:f\" }</tt>
</gras> An invocation of this method of the form
str.<tt>split(</tt>regex<tt>,</tt> n<tt>)</tt>
yields the same result as the expression

Pattern
.
compile
<tt>(</tt>regex<tt>)</tt>.
split
<tt>(</tt>str<tt>,</tt> n<tt>)</tt>


<dd><dl> * Parameters: : <dd>
regex
- the delimiting regular expression<dd>
limit
- the result threshold, as described above
* Returns: : the array of strings computed by splitting this string
around matches of the given regular expression
* Throws: : <dd>
PatternSyntaxException
- if the regular expression's syntax is invalid * Since: : <dd>1.4 * See Also: : <dd>
Pattern

</dd></dl>

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
Rejoignez-nous