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

avec Java Discussion :

Optimisation de code


Sujet :

avec Java

  1. #1
    Membre éclairé Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Par défaut Optimisation de code
    Bonjour je cherche comme mon titre l'indique à optimiser ma fonction

    Elle a pour but dans un repertoire donné de recupérer les noms de fichiers PDF et uniquement PDF

    Voici mon code :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
        public static String[] getListFichierNom()
        {
            File repertoire = new File(Informations.rootPath); File []listeFilePath = repertoire.listFiles();
            int i, j, num;
     
            //recuperation du nombre de fichiers valides
            for (i = 0, num = 0; i < listeFilePath.length ; i++)
            {
                int longueur = listeFilePath[i].getName().length();
                int index = listeFilePath[i].getName().lastIndexOf(".pdf");
                if((longueur-index == 4 && longueur > 3))
                {
                    num++;
                }
            }
            //Enregistrement dans l'objet liste des fichiers valides
            String[] liste = new String[num];
            for (i = 0, j = 0 ; i < listeFilePath.length||j <num ; i++)
            {
                int longueur = listeFilePath[i].getName().length();
                int index = listeFilePath[i].getName().lastIndexOf(".pdf");
                if((longueur-index == 4 && longueur > 3))
                {
                    liste[j] = listeFilePath[i].getName();
                    j++;
                }
            }
            return liste;
        }
    Je pense qu'il doit y avoir bien plus simple que ce que fais en sachant que ce code fonctionne

    Merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    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
     
        public static String[] getListFichierNom()
        {
            File[] listeFilePath = new File(Informations.rootPath).listFiles();
     
            List<String> list = new ArrayList<String>();
            String nameFile;
            for (File file:listeFilePath)
            {
                nameFile = file.getName();
                if(nameFile.contains(".pdf"))
                {
                    list.add(nameFile);
                }
            }
            return list.toArray(new String[list.size()]);
        }
    Ce que tu fais semble correct , je me dis qu'il est plus simple quand même d'utiliser la fonction contains(".pdf").

    Et si tu as pas absolument besoin d'un tableau de String , tu peux renvoyer une ArrayList.

    Mais bon ici c'est pas vraiment de "l'optimisation" , c'est juste pour rendre le code plus "lisible". De plus de l'optimisation sur ce genre de portion de code sert strictement à rien.

    Allez bon courrage !

  3. #3
    Membre éclairé Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Par défaut
    Merci de ta reponse

    Je n'ai pas utilisé contains pour eviter d'ajouter un fichier nommé par exemple : fichier.pdf.doc

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut,

    Pourquoi ne pas utiliser la classe FileNameFilter et la méthode associée de la classe File, ainsi que endsWith ? ce qui donne quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	public static String[] getListFichierNom() {
    		File repertoire = new File(Informations.rootPath);
    		return repertoire.list(new FilenameFilter() {
    			@Override
    			public boolean accept(File rep, String name) {
    				return name.endsWith(".pdf");
    			}
    		});
    	}
    C'est plus concis, plus clair, plus adapté je pense

    A plus

  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,


    @George7 : +1

    Toutefois il serait préférable de faire une comparaison en ignorant la case :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     name.toLowerCase().endsWith(".pdf");

    a++

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 328
    Par défaut
    Salut,

    On peut aussi utiliser JFileChooser (sans faire un choix!!!):

    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
    JFileChooser chooser = new JFileChooser();
             chooser.setCurrentDirectory(new File(".")); // dans le répertoire courant
     
             chooser.setFileFilter
                (
                   new javax.swing.filechooser.FileFilter()
                   {
                      public boolean accept(File f)
                      {
                         if(f.getName().toLowerCase().endsWith(".pdf")) // si true
                            System.out.println(f.getName());  
                         return f.getName().toLowerCase().endsWith(".pdf");
                      }
     
                      public String getDescription()
                      {
                         return "";
                      }
                   });
    Cordialement,

    Dan

  7. #7
    Membre éclairé Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Par défaut
    Merci à tous pour vos reponse

    Je ne connaissais pas cette classe
    donc j'ai decidé d'integrer la solution de george7 en ignorant la casse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        public static String[] getListFichierNom()
        {
    	File repertoire = new File(Informations.rootPath);
     
    	return repertoire.list(new FilenameFilter()
            {
                @Override
                public boolean accept(File rep, String name)
                {
    		return name.toLowerCase().endsWith(".pdf");
                }
    	});
        }
    Par contre si maintenant je veux faire un tri par date (du plus récent au plus ancien)
    Comment puisje proceder sur ce code?

    Je pense qu'il faut tester le .lastModified(); de chaque fichier avant et de les comparer 1 à 1

    Si vous avez des idées je suis preneur. Je me lance de mon coté

  8. #8
    Invité
    Invité(e)
    Par défaut
    Dans ce cas, tu peux utiliser l'interface FileFilter qui te permet d'utiliser un objet de type File pour filtrer les fichiers acceptés. La classe File a une méthode listFiles acceptant un FileFilter en paramètre.

    @adiGuba : c'est pas faux
    @danimo : si on travaille sans interface graphique, je trouve la solution d'utiliser une classe swing suboptimale, surtout que la classe File prévoit des méthodes à cet effet

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par snay13 Voir le message
    Par contre si maintenant je veux faire un tri par date (du plus récent au plus ancien)
    Comment puisje proceder sur ce code?
    Tu récupère la liste de fichiers de la même manière. Puis tu utilise Arrays.sort(listeFichier,comparateur)

    avec comparateur une classe de ton cru implémentant Comparator<File>

  10. #10
    Membre éclairé Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Par défaut
    Bonjour
    je reviens vers vous car j'ai encore besoin d'un petit coup de main

    j'essaye de suivre les conseils de Tchize mais j'ai une erreur dans mon programme

    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
        public static String[] getListFichierNom()
        {
    	File repertoire = new File(Informations.rootPath);
            File[] test = repertoire.listFiles();
    
    	String[] liste = repertoire.list(new FilenameFilter()
            {
                @Override
                public boolean accept(File rep, String name)
                {
    		return name.toLowerCase().endsWith(".pdf");
                }
    	});
            Arrays.sort(liste, TriFichierDate);      
            return liste;
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class TriFichierDate implements Comparator<File>
    {
        public int compare(File fichier1, File fichier2) 
        {
            long comparateur = fichier1.lastModified() - fichier2.lastModified();
            if(comparateur > 0)
                return -1;
            else
                return 1;
        }
    }
    l'erreur vient de la ligne surlignée dans la 1ere partie

  11. #11
    Invité
    Invité(e)
    Par défaut
    Il faut passer une instance de TriFichierDate à la méthode Arrays.sort
    donc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Arrays.sort(liste, new TriFichierDate());
    si tu n'as pas besoin de le réutiliser. Si tu réutilises souvent ta méthode, il pourrait peut-être être bien d'avoir un objet TriFichierDate instancié que tu réutilises à chaque fois.

    De plus, liste est un tableau de String, or ton comparateur est pour les objets de type File.
    Pour avoir un tableau de File, tu peux utiliser la méthode listFiles de la classe File avec un FileFilter au lieu d'un FileNameFilter (cf mon post du dessus pour la doc).

  12. #12
    Membre éclairé Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Par défaut
    Effectivement j'ai reussi à corriger mon code pour le faire fonctionner juste avant que tu me reponde

    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
     
        public static String[] getListFichierNom()
        {
    	File repertoire = new File(Informations.rootPath);
    	String[] liste = repertoire.list(new FilenameFilter()
            {
                @Override
                public boolean accept(File rep, String name)
                {
    		return name.toLowerCase().endsWith(".pdf");
                }
    	});
     
            Arrays.sort(liste, new TriFichierDate());
            return liste;
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class TriFichierDate implements Comparator<String>
    {
        public int compare(String fichier1, String fichier2)
        {
            long comparateur = new File(Informations.rootPath + fichier1).lastModified()
                    - new File(Informations.rootPath + fichier2).lastModified();
            if(comparateur > 0)
                return -1;
            else
                return 1;
        }
    }

  13. #13
    Membre éclairé Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Par défaut
    Si il reste des optimisations je suis à l'ecoute

    Sinon merci à tous




  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par snay13 Voir le message
    Si il reste des optimisations je suis à l'ecoute

    Sinon merci à tous



    Tu peux surment éviter ton if...else... en écrivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class TriFichierDate implements Comparator<String>
    {
        public int compare(String fichier1, String fichier2)
        {
            return new File(Informations.rootPath + fichier2).lastModified()
                    - new File(Informations.rootPath + fichier1).lastModified();
        }
    }
    Ça peut paraitre plus ou moins clair suivant les personnes.
    Pour être sûr : tu as fichier1 < fichier2 si fichier1 a été modifié dernièrement après fichier2, c'est bien ça ?

  15. #15
    Membre éclairé Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Par défaut
    euh non! Je crois que c'est l'inverse

    plus le fichier est recent, plus le timestamp est elevé

    mais le code que tu as posté convient sans le if et le else


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

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 08h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

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