【Android】ファイルを読み込んだ時に順番が読み込んだ順になります。種類別とかファイル名順に一覧表示する

Android

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 ""; // 拡張子なし
}

解説

  1. Arrays.sort の使用:
    • Comparator を定義してカスタムのソートロジックを記述しています。
    • ソート基準として名前、種類、拡張子などを指定。
  2. 複数条件のソート:
    • 種類別ソートでは、フォルダとファイルを区別しながら名前順に並べています。
    • 拡張子ソートでは、拡張子を比較した後、同じ拡張子内でファイル名順にソート。
  3. ヘルパーメソッド:
    • 拡張子の取得には 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) : "";
    }
}

コメント