File#listFiles() の結果をディレクトリ優先にする

Comparator を用意してTreeSetに格納する。

import java.io.File;
import java.util.Comparator;
/**
 * ディレクトリを優先にするFileの Comparator
 */

public class FilelistComparator implements Comparator<File>{
   @Override
   public int compare(File f1, File f2){
      if *1 || (f1.isFile() && f2.isFile())){
         return f1.getName().compareTo(f2.getName());
      }
      return f1.isDirectory() ? -1 : 0;
   }
}

あるいは、staticメソッドにして

public final static List<File> listFilesDirectory(File file){
   List<File> list = new ArrayList<File>();
   if (!file.isDirectory()) return list;
   Set<File> set = new TreeSet<File>(new Comparator<File>(){
      @Override
      public int compare(File f1, File f2){
         if *2 || (f1.isFile() && f2.isFile())){
            return f1.getName().compareTo(f2.getName());
         }
         return f1.isDirectory() ? -1 : 0;
      }
   });
   for(File f:file.listFiles()) set.add(f);
   for(File f:set) list.add(f);
   return list;
}

もっと良い方法があるといいのに。

*1:f1.isDirectory() && f2.isDirectory(

*2:f1.isDirectory() && f2.isDirectory(