タブレット用プログラムの書き止め

android OS & iPadOS の記録。

記録2:フォルダ内のファイル名リストアップとソート。

2021-07-11 00:21:24 | Android studio 日記

 フォルダ内のファイルをリストアップ。android studio でフォルダの所在がはっきりしていて、リスト配列が用意されている AssetManager を使っている。アプリではデータフォルダのフルパスを取得してリスト配列を作成するメソッドに差し替える。作成クラスの配列のソートはそのまま利用できる。

 フォルダ内の画像ファイル名をリストアップして順番に表示する為の基礎部分。

 

public class MainActivity extends AppCompatActivity {

    private final ArrayList<MyNumbersInString> mFileNameList = new ArrayList<>();
    private AssetManager mAssetManager;
    private int targetIndexNo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        targetIndexNo = 0;
        mAssetManager = getResources().getAssets();
        setFileNameList();

    }

    private void setFileNameList() {

        // mFileNameList.clear(); // 配列を初期化する必要がある時
        String fName;
        String[] mList = new String[0];
        try {
            mList = mAssetManager.list("image");
        } catch (IOException e) {
            e.printStackTrace();
        }
        for (String s : mList) {
            fName = s;
            fName.toLowerCase(); //小文字に変換
            if (fName.endsWith(".jpg") || fName.endsWith(".png")) { //画像ファイル選択
                mFileNameList.add(new MyNumbersInString(s));
            }
        }

        Collections.sort(
                mFileNameList, new Comparator() {
                    @Override
                    public int compare(MyNumbersInString mn1, MyNumbersInString mn2) {
                        return mn1.getName2().compareTo(mn2.getName2());
                    }
                }
        );

    }
}

 

【MyNumbersInString.java】

public class MyNumbersInString {
    private String name1 = ""; // 元のファイル名
    private String name2 = ""; // 漢字、数字混在のとき、半角数字を前方を"0"で埋めた8桁に修正

    /*
        ArrayList<> で、ファイル名をソートするための準備。name2を判定条件に使う
    **/

    public MyNumbersInString(String name ){
        name1 = name;

        StringBuilder sb = new StringBuilder(name);
        String[] msplit1 = sb.toString().split( "[^\\d]" ); // 数字以外で分割
        String[] msplit2 = sb.toString().split( "\\d" );   // 数字で分割

        boolean mFlag = true;
        sb = new StringBuilder();

        // 1つの文字列を同条件反転分割しているので[0]のみ、どちらか必ず文字が入っている

        if (msplit1[0].length() == 0) {
            //mFlag = true;
            sb.append(msplit2[0]); // 文字を積む
        }
        if (msplit2[0].length() == 0) {
            mFlag = false;
            sb.append( zeroCompensation( msplit1[0]) ); // 0補填をして数字を積む
        }

        // 数字の次は文字、文字の次は数字、フラグで切り替え積んでいく。数字は0補填
        int i = 0, j = 0, len;
        while ( ( i < msplit1.length ) && ( j < msplit2.length ) ) {
            if (mFlag) { // 直前が数字でなかった
                if ( ++i < msplit1.length ) {
                    if (msplit1[i].length() != 0) { // 数字が現れた
                        sb.append( zeroCompensation( msplit1[i] ) );
                        mFlag = false;
                    }
                }
            } else { // 直前が文字でなかった
                if ( ++j < msplit2.length ) {
                    if (msplit2[j].length() != 0) { // 文字が現れた
                        sb.append(msplit2[j]);
                        mFlag = true;
                    }
                }
            }
        }

        name2 = sb.toString();
    }
    public String getName(){
        return name1;
    }
    public String getName2(){
        return name2;
    }

    private String zeroCompensation(String text){
        StringBuilder sb = new StringBuilder();
        int len = text.length(); // 桁数
        if ( len < 8 ) { // 8桁以下なら0を前に付けて8桁に合わせる
            len = 8 - len;
            for (int c = 0; c < len; c++) {
                sb.append("0");
            }
        }
        sb.append( text );
        return sb.toString();
    }
}

 

"123abc123.jpg" ファイル名とすると、

      msplit1(数字以外で分割)  msplit2(数字で分割)
1       "123"                               ""
2       ""                                     ""
3       ""                                     ""
a       ""                                     "abc"
b       "123"                                ""
c        ""                                     ""
1        ""                                     ""
2        ""                                     ".jpg"
3        ""
.
j
p
g

分割された文字列のイメージ。数字部分を抽出して"0"を足して8桁にする。そして、分割文字を組み直してファイル名を作っている。

"00000123abc00000123.jpg" と 、"123abc123.jpg" は、紐づけられていて前者を元に並べ替えをさせる。

メソッドで呼び出すのは、"123abc123.jpg" 実ファイル名の方。

続く。