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

android OS & iPadOS の記録。

public class MyNumbersInString{} 不具合修整。

2021-11-23 03:00:35 | Android studio 日記

ファイル名、ディレクトリ名に数字が含まれていた時の並び順の修正用の文字列作成に不具合あり。
数字が含まれていなかった場合、エラー発生する。実行時はディレクトリ、ファイルに全て数字が含まれていたために発見されなかった。今回、親のフォルダを遡るテストをしていて「files」ディレクトリを読み込んで不具合が見つかった。

数字部分が無い時は、name2 = name として戻る。

 

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" ); // 数字で分割

        // 修正、付け加え数字部分が無い時は、name2 = name; とする。
        if ( msplit1.length == 0 || msplit2.length == 0 ) {
            name2 = name;
            return;
        }
       // ここまで。

        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();
    }
}