111 votes

comment faire pour que File.listFiles soit dans l'ordre alphabétique ?

J'ai le code suivant :

class ListPageXMLFiles implements FileFilter {

        @Override
        public boolean accept(File pathname) {
                DebugLog.i("ListPageXMLFiles", "pathname is " + pathname);

                String regex = ".*page_\\d{2}\\.xml";
                if(pathname.getAbsolutePath().matches(regex)) {
                        return true;
                }
                return false;
        }
}

public void loadPageTrees(String xml_dir_path) {
        ListPageXMLFiles filter_xml_files = new ListPageXMLFiles();
        File XMLDirectory = new File(xml_dir_path);
        for(File _xml_file : XMLDirectory.listFiles(filter_xml_files)) {
                loadPageTree(_xml_file);
        }
}

El FileFilter fonctionne bien, mais listFiles() semble lister les fichiers dans l'ordre alphabétique inverse. Existe-t-il un moyen rapide de dire listFile() pour lister les fichiers par ordre alphabétique ?

1 votes

Au lieu d'utiliser une expression rationnelle, utilisez .endsWith(".xml") à la place.

251voto

Ray Toal Points 35382

El listFiles avec ou sans filtre ne garantit aucun ordre.

Cependant, elle renvoie un tableau, que vous pouvez trier avec la commande Arrays.sort() .

File[] files = XMLDirectory.listFiles(filter_xml_files);
Arrays.sort(files);
for(File _xml_file : files) {
    ...
}

Cela fonctionne parce que File est une classe comparable, qui par défaut trie les noms de chemin lexicographiquement. Si vous voulez les trier différemment, vous pouvez définir votre propre comparateur.

Si vous préférez utiliser Streams :

Une approche plus moderne est la suivante. Pour imprimer les noms de tous les fichiers d'un répertoire donné, par ordre alphabétique, faites :

Files.list(Paths.get(dirName)).sorted().forEach(System.out::println)

Remplacer le System.out::println avec ce que vous voulez faire avec les noms de fichiers. Si vous ne voulez que des noms de fichiers qui se terminent par "xml" faites-le :

Files.list(Paths.get(dirName))
    .filter(s -> s.toString().endsWith(".xml"))
    .sorted()
    .forEach(System.out::println)

Là encore, remplacez l'impression par l'opération de traitement de votre choix.

0 votes

C'est une belle ligne de code, mais Arrays.sort() semble retourner void, au lieu d'un Iterable. Je vais chercher un peu.

3 votes

@Thunder Rabbit, Toutes mes excuses !! Je suis désolé, vous avez raison. J'aurais dû le tester. J'ai modifié ma réponse.

0 votes

Cela semble fonctionner correctement sous Windows, mais sous Ubuntu, les dossiers avec des lettres majuscules apparaissent en premier par rapport aux autres.

4voto

Sergei Rodionov Points 1491

En Java 8 :

Arrays.sort(files, (a, b) -> a.getName().compareTo(b.getName()));

Ordre inverse :

Arrays.sort(files, (a, b) -> -a.getName().compareTo(b.getName()));

2 votes

Vous pouvez également utiliser ce code : Arrays.sort(fList, Comparator.comparing(File::getName));

1 votes

Faites attention à cela. Ce code est non déterministe et ne doit pas être utilisé tel quel.

2voto

CPU 100 Points 2269

Je pense que la réponse précédente est la meilleure façon de le faire. Voici une autre façon simple, qui consiste à imprimer les résultats triés.

 String path="/tmp";
 String[] dirListing = null;
 File dir = new File(path);
 dirListing = dir.list();
 Arrays.sort(dirListing);
 System.out.println(Arrays.deepToString(dirListing));

0 votes

Pourriez-vous nous dire pourquoi vous pensez que cette réponse n'est pas correcte ? Ainsi, je peux la réviser en conséquence.

1 votes

-Je ne comprends vraiment pas l'avantage de convertir le tableau de fichiers en un tableau de chaînes de caractères, puis de le trier, plutôt que de trier simplement le tableau de fichiers comme le fait la réponse acceptée.

0 votes

@zelanix merci de nous faire part de vos commentaires. Je n'ai pas toutes les réponses et je fais parfois des erreurs en répondant aux questions. J'ai mis à jour la réponse, pourriez-vous s'il vous plaît l'examiner et voir si c'est une meilleure solution.J'apprécierais si vous pouviez reconsidérer votre vote. Merci d'avance.

0voto

Tru Nguyen Points 11

Voici mon code :

        try {
            String folderPath = "../" + filePath.trim() + "/";
            logger.info("Path: " + folderPath);
            File folder = new File(folderPath);
            File[] listOfFiles = folder.listFiles();
            int length = listOfFiles.length;
            logger.info("So luong files: " + length);
            ArrayList<CdrFileBO> lstFile = new ArrayList< CdrFileBO>();

            if (listOfFiles != null && length > 0) {
                int count = 0;
                for (int i = 0; i < length; i++) {
                    if (listOfFiles[i].isFile()) {
                        lstFile.add(new CdrFileBO(listOfFiles[i]));
                    }
                }
                Collections.sort(lstFile);
                for (CdrFileBO bo : lstFile) {
                    //String newName = START_NAME + "_" + getSeq(SEQ_START) + "_" + DateSTR + ".s";
                    String newName = START_NAME + DateSTR + getSeq(SEQ_START) + ".DAT";
                    SEQ_START = SEQ_START + 1;
                    bo.getFile().renameTo(new File(folderPath + newName));
                    logger.info("newName: " + newName);
                    logger.info("Next file: " + getSeq(SEQ_START));
                }

            }
        } catch (Exception ex) {
            logger.error(ex);
            ex.printStackTrace();
        }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X