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

Langage Java Discussion :

[Language]Probleme récursivité


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Hoegaarden
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2004
    Messages : 362
    Par défaut [Language]Probleme récursivité
    Bonjour à tous.

    Voila mon problème :
    J'ai une arborescence de fichier et je voudrais mettre à true une fonction lorsque le fichier nommé Test est trouvé. Le truc c'est que je ne sait pas où il se trouve dans mon arborescence; il peut très bien se trouver à la racine comme à la fin.

    voila le code que j'ai fait mais la valeur retournée est à chaque fois false même si le fichier existe

    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
    16
    17
    18
    19
     
    public static boolean checkAssemble (File directoryPath) {
     
    		boolean checkAssemble = false;  // declare the returned boolean
    		String modele = "Test";
     
    		File[] f = directoryPath.listFiles();  // Get directory contents
    		File fName = null; // a directory item
     
    		for (int i=0; i<f.length; i++) {
    			fName = f[i];
    			if (Pattern.matches(modele,fName.getName())){
    				checkAssemble =true;
    			} else	if (fName.isDirectory())	{
    				checkAssemble(fName);
    			}
    		}
    		return checkAssemble; 
    	}
    une idée ?

    merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 154
    Par défaut
    Tu ne fais jamais passer ton résultat aux niveaux supérieurs. Ce qui fait que si tu trouve le résultats, les niveaux supérieures ne le savent pas.
    Il faut au moins que tu récupère le résultat.

    Sinon, dans un soucis d'optims, dès que tu trouve le fichier tu peux faire un return. pas la peine de continuer à chercher.

    A ta place je ferais plutôt ceci :
    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
    16
    17
    18
    19
    20
    21
     
    public static boolean checkAssemble (File directoryPath) {
     
          boolean checkAssemble = false;  // declare the returned boolean
          String modele = "Test";
     
          File[] f = directoryPath.listFiles();  // Get directory contents
          File fName = null; // a directory item
     
          for (int i=0; i<f.length; i++) {
             fName = f[i];
             if (Pattern.matches(modele,fName.getName())){
    //            checkAssemble =true; // modifs
                   return true; // en voi du résultat si le fichier à été trouvé
             } else   if (fName.isDirectory())   {
                checkAssemble = checkAssemble(fName); // modifs : récupération du résultats du niveau inférieure
                if(checkAssemble) return true; // ajouts : renvoi du résultats au niveau supérierur si le fichier à été trouvé dans cette branche de l'arborescence
             }
          }
          return checkAssemble;
       }
    Ainsi, dès que le résultat est trouvé, il est remonté vers le premier appel de la fonction.

  3. #3
    Membre chevronné
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Par défaut
    Commences par faire des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("Fichier trouvé :"+fName.getName());
    dans ta boucle pour contrôler si il le trouve dans ton parcours...
    Ensuite en fonction du résultat, affines tes affichages console pour detcter où se trouve le "bugg".

  4. #4
    Membre éclairé Avatar de Hoegaarden
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2004
    Messages : 362
    Par défaut
    merci je commencais à galérer la dessus

    ++

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Je vois deux problèmes :

    1. Ta méthode n'est pas vraiment récursive dans le sens où elle ne récupère pas le code de retour de l'appel de checkAssemble() (et donc si le fichier est dans un sous-répertoire le true est 'perdu').
    2. Il faut que tu arrêtes la boucle for dès que tu trouves ce fichier (sinon les résultats des autres fichiers vont écrasé la valeur de ton fichier).

    Ce qui donne :
    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
    16
    17
    18
    19
     
        public static boolean checkAssemble (File directoryPath) {   
     
            boolean checkAssemble = false;  // declare the returned boolean
            String modele = "Test";
     
            File[] f = directoryPath.listFiles();  // Get directory contents
            File fName = null; // a directory item
     
            for (int i=0; i<f.length&&checkAssemble==false; i++) {
               fName = f[i];
               if (Pattern.matches(modele,fName.getName())){
                  checkAssemble = true;
               } else   if (fName.isDirectory())   {
                   checkAssemble = checkAssemble(fName);
               }
            }
            return checkAssemble;
         }
    a++

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 20/09/2005, 10h54
  2. Réponses: 3
    Dernier message: 13/08/2005, 16h18
  3. [Language]problème lors de l'appel d'une méthode
    Par Samanta dans le forum Langage
    Réponses: 6
    Dernier message: 18/05/2005, 14h03
  4. Réponses: 6
    Dernier message: 25/04/2005, 18h33
  5. Réponses: 2
    Dernier message: 05/10/2004, 23h43

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