Windows Explorer 風の「フォルダを先に → ファイルを後に」並べるソートを Java で実現する方法を紹介します。
実務的なシナリオ
- ディレクトリを一覧表示するとき、フォルダが先に並び、その後にファイルが並ぶようにしたい。
- さらに、フォルダ内では名前順、ファイル内でも名前順に並べる。
完全なコード例
import java.io.File;
import java.util.*;
public class ExplorerLikeSort {
public static void main(String[] args) {
// 対象ディレクトリを指定(例: C:/example)
File dir = new File("C:/example");
File[] files = dir.listFiles();
if (files == null) {
System.out.println("ディレクトリが存在しないか、アクセスできません。");
return;
}
// フォルダ優先 → ファイル のソート
Arrays.sort(files, new Comparator<File>() {
@Override
public int compare(File f1, File f2) {
// 1. フォルダ優先
if (f1.isDirectory() && !f2.isDirectory()) {
return -1; // f1がフォルダなら先
} else if (!f1.isDirectory() && f2.isDirectory()) {
return 1; // f2がフォルダなら先
}
// 2. 同じ種類なら名前順
return f1.getName().compareToIgnoreCase(f2.getName());
}
});
// 結果を表示
System.out.println("=== Windows Explorer風ソート結果 ===");
for (File f : files) {
String type = f.isDirectory() ? "[DIR]" : "[FILE]";
System.out.println(type + " " + f.getName());
}
}
}
Java実行例(仮想出力)
=== Windows Explorer風ソート結果 ===
[DIR] Documents
[DIR] Pictures
[DIR] Videos
[FILE] notes.txt
[FILE] report.pdf
[FILE] todo.docx
応用ポイント
- サイズ順にしたい場合:
thenComparingLong(File::length)を追加。 - 更新日順にしたい場合:
thenComparingLong(File::lastModified).reversed()を追加。 - 複合条件: 「フォルダ優先 → 名前順 → 更新日順」など自由に組み合わせ可能。
これで「フォルダ優先 → ファイル」の Windows Explorer 風ソートが実現できます。
