1. ホーム
  2. java

[解決済み] File.listFilesをアルファベット順に並べるには?

2022-11-26 22:32:56

質問

以下のようなコードがあります。

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);
        }
}

FileFilter はうまく動作していますが listFiles() は逆アルファベット順でファイルをリストアップしているようです。 何か手っ取り早い方法はないでしょうか? listFile() にアルファベット順のファイルをリストアップするための、何か簡単な方法はありますか?

どのように解決するのですか?

この listFiles メソッドは、フィルタの有無にかかわらず、いかなる順序も保証しません。

しかし、これは配列を返すので、それを Arrays.sort() .

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

これは File は比較可能なクラスであり、デフォルトではパス名を辞書順にソートするからです。 もし別の方法でソートしたいのであれば、独自のコンパレータを定義することができます。

Streamsを使うのが好きなら

より現代的なアプローチとして、次のようなものがあります。与えられたディレクトリにあるすべてのファイルの名前をアルファベット順に表示するには、次のようにします。

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

を置き換える System.out::println を、ファイル名として使いたいものに置き換えてください。もし、ファイル名の末尾を "xml" で終わるファイル名だけが必要なら、そうするだけです。

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

ここでも、印刷を好きな処理に置き換えてください。