Boucle dans arrayList

cs_essira Messages postés 2 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 28 mai 2007 - 28 mai 2007 à 19:31
cs_essira Messages postés 2 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 28 mai 2007 - 28 mai 2007 à 21:14
Bonjour,

 j'ai un programme qui lit un fichier texte ligne par ligne. A partir d'une certaine indication, il sépare les lignes en 15 string différentes ( 15 gènes ) en  utilisant une arrayList.
Le problème provient du fait que je dois remplacer un gène au hasard par des "?" pour une seule ligne, qu'elle choisi aussi aléatoirement. Dans le programme suivant, cela fonctionne, mais efface par la suite le meme gène pour toutes les lignes suivantes jusqu'à la fin.

  String name = "";
                      String base = "";
               
                      Random generator = new Random();
                     
                      int delRow = 0;//choisi dans quelle ligne deleter le gene ( la rangee)
                      int delCol;//choisi quel gene de 1 a 15 a deleter ( la colonne)
                      String manquante = "?";
                      delCol = generator.nextInt( 14);
                      delRow = 20+generator.nextInt( 39);
     
                 
                
                   do{   
                         //RETIRE LA PREMIERE PARTIE DE LA LIGNE (NAME)_ PAS IMPORTANT 
                        String line1 = content[i];   
                        StringTokenizer tok  = new StringTokenizer(line1);
                           
                        name = tok.nextToken().trim();
                           base  = "";
                           
                           if(tok.hasMoreTokens()) 
                               base = tok.nextToken();
                           i++;
                         
             //DIVISE LA LIGNE EN 15 GENES
                          
                           gene.add(new String (base.substring(0,204)));
                        gene.add(new String (base.substring(204,534)));
                        gene.add(new String (base.substring(534,867)));   
                        gene.add(new String (base.substring(867,1204)));   
                        gene.add(new String (base.substring(1204,1544)));   
                        gene.add(new String (base.substring(1544,1966)));
                        gene.add(new String (base.substring(1966,2392)));
                        gene.add(new String (base.substring(2392,2836)));   
                        gene.add(new String (base.substring(2836,3394)));   
                        gene.add(new String (base.substring(3394,4084)));   
                        gene.add(new String (base.substring(4084,4774)));   
                        gene.add(new String (base.substring(4774,5548)));   
                        gene.add(new String (base.substring(5548,6382)));   
                        gene.add(new String (base.substring(6382,7360)));   
                        gene.add(new String (base.substring(7360,8362)));   

                   
                        String geneDel = null ;
                       
                       
                         if ( i == delRow){//si la ligne i correspond a delRow, on efface le gene dans cette ligne ET POURQUOI LES SUIVANTES???
                           
                            geneDel = gene.get(delCol); //retourne le gene delCol
                             int geneSize = geneDel.length(); //retourne la longueur du delCol
                             for( int b = 0; b <= geneSize -1; b++) //tant qu'on a pas atteint la longueur
                                  manquante = (manquante +'?'); //on ajoute un ?
                             gene.set(delCol, manquante);
                        }
           
                         //NE FONCTIONNE PAS, EFFACE LE GENE DANS LES LIGNES SUIVANT LE delRow
                         if(i != delRow){
                             
                              geneDel = gene.get(delCol);
                              gene.set(delCol,geneDel);
                          }
                         
                    //ECRIT DANS UN FICHIER TEXTE
                        out.write(name + " " + toString()+ "\n" );
                       
                       
                    //DEFINI LA SECTION DU FICHIER TEXTE D'ENTREE QU'ON VEUT DIVISER EN GENES  
                    while((content[i].startsWith("Taxon"))&&!(content[i].trim()).equals(";")&&!(content[i].trim()).equals("END;"));{
                                if(content[i].trim()!="\n"){
                                    base = base + content[i];
                                    i++;
                                }
                        }

Comment faire pour que seul le gène de la ligne désirée soit effacée, et non pas à toute les lignes suivantes?

       Merci infiniement

3 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
28 mai 2007 à 20:12
Salut,

utilise else if et non deux if

 if ( i == delRow){
    ....
 } else if  (i != delRow) {
    ...
 }

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
ltb69 Messages postés 5 Date d'inscription samedi 7 octobre 2006 Statut Membre Dernière intervention 16 mars 2009
28 mai 2007 à 21:01
Evite le new String(String). Ca ne sert a rien (String est imutable) et ca complique vachement la lecture.

Autre remarque, sur la beaute du code ( :)) :
tu fais un :
base  = "";
if(tok.hasMoreTokens()) 
                               base = tok.nextToken();
                           i++;
gene.add(new String (base.substring(0,204))); ...

Cela fonctionne surement avec ton fichier, mais ce n'est pas robuste. Si tu n'as plus de tokens (hasMoreTokens() vaut false), base vaut chaine vide, et le substring plante.
Il faut toujours ecrire du code le plus robuste possible (on dirait un prof qui parle :)))
0
cs_essira Messages postés 2 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 28 mai 2007
28 mai 2007 à 21:14
Bonjour!


 merci pour vos réponses! J'ai malheureusement essayé le else if et toutes les boucles possibles et inimaginables avec toujours le même résultats.
Pour itb69, je prends tes commentaires en note. Je n'ai mis qu'une petite partie de mon programme, et je tente pour l'instant de régler mon problème de boucle avant tout, la finition et généralisation ira après. Merci, je m'en occuperai rendu-là.

D'autres idées pour expliquer mon problème?
0
Rejoignez-nous