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

android OS & iPadOS の記録。

基礎。ArrayList<>のsort()など。昇順、降順。

2021-12-16 14:00:29 | Android studio 日記

プリファレンス保存、読み出しでSet<> <=> List<> の変換だけで楽だった。
しかし、新しく登録したものが最初に出てこなくなる副作用が…。これは気に入らない。
変換時に順番が入れ替わってしまうようだ。
なので、昇順降順の切り替え、名前、登録時の時間での並び替えを実現する配列を考える。

並び替えの元を作る。パス、登録時の時間、プリファレンス用文字列。
追加、削除、プリファレンス入出力に都合のいい3種のデータをパックにした。

public class MyStringForFavorite {

    private String main = ""; // 画像パス
    private String time = ""; // 登録時の時間
    private String join = ""; // 結合文字列

    public MyStringForFavorite( String name ) { // name は画像パスか、時間+",,"+パスの限定。それ以外は飛ぶ・・かな。
        join = name;
        String[] mSplit = name.split(",,"); // 時間+",,"+パスを分離。

        if (mSplit.length == 1){ // 時間成分が無い
            main = mSplit[0];
            time = getNowDate();
            join = time + ",," + main; // 時間+",,"+パスで結合保存。
        } else {
            time = mSplit[0];
            main = mSplit[1];
        }
    }
    public String getPath(){ return main; }
    public String getTime(){ return time; }
    public String getJoin(){ return join; }
    private String getNowDate() {
        @SuppressLint("SimpleDateFormat") DateFormat df = new SimpleDateFormat( "yyyy-MM-dd--HH-mm-ss" );
        Date date = new Date( System.currentTimeMillis() );
        return df.format(date);
    }
}

 

// 上の MyString クラスを配列で使うための MyList クラスを作る。


SetToArrayList(Set<>) でプリファレンスから読み込んだ Set<> を ArrayList<> まで変換させている。

ソート部分の
Collections.sort(
    mPathNameList, new Comparator< MyStringForFavorite >() {
        @Override
        public int compare(MyStringForFavorite mn1, MyStringForFavorite mn2) {
            return - mn1.getTime().compareTo(mn2.getTime());
        }
    }
);
ここで時間を元に並び変え。return値にマイナス符号を付加して降順配列としている。
マイナス符号を付けなければ、この場合は昇順配列となる。
追加、削除、その他ソート、RecyclerView用のList<>排出、リファレンス用のSet<>排出を用意。

public class MyFavoriteList {

    private ArrayList< MyStringForFavorite > mPathNameList;

    MyFavoriteList() {
          mPathNameList = new ArrayList< MyStringForFavorite >();
    }

    public void SetToArrayList( Set< String > sou ) { // リファレンスデータ変換

        if ( sou == null || sou.isEmpty() ) {
            clear();
            return;
        }
        List< String > temp = new ArrayList< String >(sou); // Set<> を List<>に変換。

        for (int i=0; i < temp.size(); i++ ) {
            mPathNameList.add( new MyStringForFavorite(temp.get(i))); // ArrayListへ追加。
        }

        Collections.sort(
                mPathNameList, new Comparator< MyStringForFavorite >() {
                    @Override
                    public int compare(MyStringForFavorite mn1, MyStringForFavorite mn2) {
                        return - mn1.getTime().compareTo(mn2.getTime());
                    }
                });
    }

    public void add( String path ) {
        if ( path == null ) return;
        mPathNameList.add( 0, new MyStringForFavorite( path )); // 引数 0 は先頭追加
    }
    public boolean remove(int index) {
        if ( mPathNameList.isEmpty() || index < 0 || index >= mPathNameList.size() ) return false;
        try {
            mPathNameList.remove(index);
        } catch (UnsupportedOperationException e ) {
            e.printStackTrace();
        }
        return true;
    }
    public void sortTime(boolean flag) {

        if ( flag ) {
            Collections.sort(
                    mPathNameList, new Comparator< MyStringForFavorite >() {
                        @Override
                        public int compare(MyStringForFavorite mn1, MyStringForFavorite mn2) {
                            return mn1.getTime().compareTo(mn2.getTime());
                        }
                    } );
        } else {
//省略 return - mn1.getTime().compareTo(mn2.getTime()); マイナス符号付くだけ
       }
    }
    public void sortPath(boolean flag) {

        if ( flag ) {
            Collections.sort(
                    mPathNameList, new Comparator< MyStringForFavorite >() {
                        @Override
                        public int compare(MyStringForFavorite mn1, MyStringForFavorite mn2) {
                            return mn1.getPath().compareTo(mn2.getPath());
                        }
                    } );
        } else {
//省略 return - mn1.getPath().compareTo(mn2.getPath()); マイナス符号付くだけ
        }
    }

    public List< String > getList() { // RecyclerView用List<>データ
        List< String > list = new ArrayList< String >();

        for (int i=0; i < mPathNameList.size(); i++ ){
            list.add( mPathNameList.get(i).getPath() );// フルパス
        }
        return list;
    }
    public Set< String > getSet() { // リファレンス用Set<>データ
        List< String > list = new ArrayList< String >();

        for (int i=0; i < mPathNameList.size(); i++ ){
            list.add( mPathNameList.get(i).getJoin() );// 日時+フルパス
        }
        return new HashSet< String >( list );
    }

    public String getPath(int index) {
        if ( mPathNameList.isEmpty() || index < 0 || index >= mPathNameList.size() ) return null;
        return mPathNameList.get(index).getPath();
    }
    public boolean isEmpty() { return mPathNameList.isEmpty(); }
    public int size() { return mPathNameList.size(); }

    public void clear() { mPathNameList.clear(); }
    public void finish() {
        mPathNameList.clear();
        mPathNameList = null;
    }
}

なんか、
Set< String > listData = new HashSet< String >( list );
法則性の処理があるみたいで、削除、先頭追加を繰り返してみても同じような場所に配置換えされた。
まぁ、しょうがない。