Javaでは、Arrays.sort() や Collections.sort() を使用して簡単にソートできます。
以下に具体的な例を示します:
ファイルを名前順にソートする場合
java
import java.io.File;
import java.util.Arrays;
public void displayFilesSortedByName() {
File directory = new File(mSharedViewModel.mStorageDataPath);
File[] files = directory.listFiles();
if (files != null) {
// ファイル名でソート
Arrays.sort(files, (f1, f2) -> f1.getName().compareToIgnoreCase(f2.getName()));
for (File file : files) {
if (file.isDirectory()) {
Log.d(TAG, "[フォルダ] " + file.getName());
} else if (file.isFile()) {
Log.d(TAG, "[ファイル] " + file.getName());
}
}
}
}
種類別 (フォルダ→ファイルの順) にソートする場合
まず、フォルダを優先して表示し、次にファイルを表示するようにします。
java
import java.io.File;
import java.util.Arrays;
public void displayFilesSortedByType() {
File directory = new File(mSharedViewModel.mStorageDataPath);
File[] files = directory.listFiles();
if (files != null) {
// 種類 (フォルダ優先) でソート
Arrays.sort(files, (f1, f2) -> {
if (f1.isDirectory() && !f2.isDirectory()) {
return -1; // フォルダを先に
} else if (!f1.isDirectory() && f2.isDirectory()) {
return 1; // ファイルを後に
} else {
return f1.getName().compareToIgnoreCase(f2.getName()); // 名前順
}
});
for (File file : files) {
if (file.isDirectory()) {
Log.d(TAG, "[フォルダ] " + file.getName());
} else if (file.isFile()) {
Log.d(TAG, "[ファイル] " + file.getName());
}
}
}
}
拡張子でソートする場合
拡張子を基準にソートし、同じ拡張子の場合はファイル名でソートします。
java
import java.io.File;
import java.util.Arrays;
public void displayFilesSortedByExtension() {
File directory = new File(mSharedViewModel.mStorageDataPath);
File[] files = directory.listFiles();
if (files != null) {
// 拡張子でソート
Arrays.sort(files, (f1, f2) -> {
String ext1 = getFileExtension(f1);
String ext2 = getFileExtension(f2);
int extComparison = ext1.compareToIgnoreCase(ext2);
if (extComparison == 0) {
return f1.getName().compareToIgnoreCase(f2.getName()); // ファイル名でソート
}
return extComparison;
});
for (File file : files) {
if (file.isDirectory()) {
Log.d(TAG, "[フォルダ] " + file.getName());
} else if (file.isFile()) {
Log.d(TAG, "[ファイル] " + file.getName());
}
}
}
}
// 拡張子を取得するヘルパーメソッド
private String getFileExtension(File file) {
String name = file.getName();
int lastDotIndex = name.lastIndexOf('.');
if (lastDotIndex != -1 && lastDotIndex < name.length() - 1) {
return name.substring(lastDotIndex + 1);
}
return ""; // 拡張子なし
}
解説
Arrays.sortの使用:Comparatorを定義してカスタムのソートロジックを記述しています。- ソート基準として名前、種類、拡張子などを指定。
- 複数条件のソート:
- 種類別ソートでは、フォルダとファイルを区別しながら名前順に並べています。
- 拡張子ソートでは、拡張子を比較した後、同じ拡張子内でファイル名順にソート。
- ヘルパーメソッド:
- 拡張子の取得には
getFileExtension()を使用。
- 拡張子の取得には
これで種類別、ファイル名順、拡張子順など柔軟なソートが可能になります
リファクタリング案(ブログ掲載用)
ソート部分を整理し、可読性を高めたコード例です。
Java
import java.io.File;
import java.util.Arrays;
import java.util.Comparator;
public class FileSorter {
// 1. 名前順
public void sortByName(File[] files) {
Arrays.sort(files, (f1, f2) -> f1.getName().compareToIgnoreCase(f2.getName()));
}
// 2. 種類別(フォルダ優先 + 名前順)
public void sortByType(File[] files) {
Arrays.sort(files, (f1, f2) -> {
if (f1.isDirectory() && !f2.isDirectory()) return -1;
if (!f1.isDirectory() && f2.isDirectory()) return 1;
return f1.getName().compareToIgnoreCase(f2.getName());
});
}
// 3. 拡張子順(拡張子 + 名前順)
public void sortByExtension(File[] files) {
Arrays.sort(files, (f1, f2) -> {
String ext1 = getFileExtension(f1);
String ext2 = getFileExtension(f2);
int res = ext1.compareToIgnoreCase(ext2);
return (res != 0) ? res : f1.getName().compareToIgnoreCase(f2.getName());
});
}
private String getFileExtension(File file) {
if (file.isDirectory()) return ""; // フォルダは拡張子なしとして扱う
String name = file.getName();
int lastDotIndex = name.lastIndexOf('.');
return (lastDotIndex > 0) ? name.substring(lastDotIndex + 1) : "";
}
}




コメント