Androidアプリ開発

配列のソート・シャッフル・重複排除

この記事は約9分で読めます。
スポンサーリンク

こんにちは、まっさん(@Tera_Msaki)です。

この記事は Androidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Java での開発経験、XML構文規則、Android のアプリ開発経験がある方を対象としています。
Android のアプリ開発でお役にたててれば、嬉しいです。
(これから Android のアプリ開発や Java での開発を始めたい方への案内は、
記事の最後で紹介します)

この記事のテーマ


配列にあるデータのソート、シャッフル、重複排除を実装する

ポイント

Andoridアプリの開発で、
配列にセットしているデータの並び替え(
ソート)や、
ランダムで並び替え(
シャッフル)、
重複しているデータを配列から排除(
重複排除)が必要な場合があります。
実装する方法はいくつかありますが、
比較的コーディングが少なく、
簡単で便利な実装方法について、紹介します。

ソート

Comparator を使って、ArrayListを並び替えます。
オーバライドする
compareに並び替えする条件を記述します。
サンプルの区間タイムリスト表示では、
MapにセットされたString(区間タイム)をArrayListに展開して、
Comparatorを継承した内部クラスでソート(昇順)します。

    : 
    // 区間タイムソート用内部クラス
    private static class SectionListComparator implements Comparator<String> {
        @Override
        public int compare(String section1, String section2) {
            return section1.compareTo(section2);
        }
    }
    :
    // 区間タイムリスト表示 //
    ArrayList<String> sectionTimeList = new ArrayList<>();
    for (AccessFile accessFile : motionList) {
            SectionList sectionList = sectionListMap.getOrDefault(accessFile.sequence, new SectionList(null, "No date", new ArrayList<>(), new ArrayList<>(), new ArrayList<>()));
            if (sectionList != null) {
                if (sectionList.section.size() > index)
                    sectionTimeList.add(sectionList.section.get(index));
            }
    }
    sectionTimeList.sort(new SectionListComparator());
    :

シャッフル

シャッフルはRandomを使用して、
配列の並び替える順序を先に作成します。
次に作成した配列の並び替える順序で、
配列を入れ替えることでシャッフルを実現します。
サンプルのミュージックリスト作成では、
最初に
Map(musicItemMap)にセットされた
エンティティ(MusicItem)を
List (musicItems)に展開します。
次に
Randomを使って、並び替える順序(randomList)を作成します。
ミュージックリストは同じ曲が含まれないようにするため、
重複なしで並び替える順序を作成する必要があります。
Listのサイズが大きい場合は、
ミュージックリストのサイズ(MUSICLIST)の 約90% になるように調整しています。
最後に作成した並び替える順序を使って、
展開した
Listからシャッフル後のミュージックリスト(musicItemList)を作成します。

    :
    // ミュージックリスト作成
    public void selMusicList(boolean random, int MUSICLIST) {
        List<MusicItem> musicItems = new ArrayList<>();
        List<MusicItem> musicItemList = new ArrayList<>();
        List<Integer> randomList = new ArrayList<>();
        musicItemMap.forEach((key, value) -> musicItems.add(value));
        Random rand = new Random();
        MUSICLIST = Math.min(MUSICLIST, musicItems.size());
        MUSICLIST = MUSICLIST > 10 &&  (int)(MUSICLIST * 1.1) > musicItems.size() ?  (int) (musicItems.size() / 1.1)  : MUSICLIST;
        if (random) {
            while (randomList.size() < MUSICLIST || randomList.size() < musicItems.size()) {
                randomList.add(rand.nextInt(musicItems.size()));
                randomList = new ArrayList<>(new LinkedHashSet<>(randomList));
            }
        }
        for (int i = 0; i < MUSICLIST; i++) {
            musicItemList.add(musicItems.get(random ? randomList.get(i) : i));
        }
        mainActivity.getHomeFragment().updateMusicList(musicItemList);
    }
    :

参考:エンティティクラス(MusicItem)

public class MusicItem {
    public String   title;      // タイトル
    public String   artist;     // アーティスト
    public long     duration;   // 再生時間
    public Uri      albumUri;   // アルバムUri
    public Uri      musicUri;   // 音楽ファイルUri
    public String   source;     // 音楽ファイル
    public MusicItem(String title, String artist, long duration, Uri albumUri, Uri musicUri, String source) {
        this.title    = title;
        this.artist   = artist;
        this.duration = duration;
        this.albumUri = albumUri;
        this.musicUri = musicUri;
        this.source   = source;
    }
}

重複排除

配列の重複データを排除する場合、
HashSetあるいは、LikedHashSetを使用します。
LikedHashSetは順序を保証しますが、
HashSetは保証しない部分が違います。
処理コストは、
HashSetが少ないので、
配列が大きい、順序性が不要な場合は、
HashSetを使う方がよいと考えます。

  :     
    while (randomList.size() < MUSICLIST || randomList.size() < musicItems.size()) {
                randomList.add(rand.nextInt(musicItems.size()));
                randomList = new ArrayList<>(new LinkedHashSet<>(randomList));
    }
    :

今回は、ここまでです。

配列のシャッフル・重複排除を使用している Androidアプリです。

誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にある
コメントか、
こちら
から、お願いいたします♪

ポチッとして頂けると、
次のコンテンツを作成する励みになります♪

ブログランキング・にほんブログ村へ

これからAndroidのアプリ開発やJavaでの開発を始めたい方へ

初めての Android のアプリ開発では、アプリケーション開発経験がない方や、
アプリケーション開発経験がある方でも、Java や C# などのオブジェクト指向言語が初めての方は、
書籍などによる独学ではアプリ開発できるようになるには、
かなりの時間がかかりますので、オンラインスクールでの習得をおススメします。

未経験者からシステムエンジニアを目指すのに最適かと、
まずは無料相談から♪

無料でJava言語を学べるのは、かなり魅力的♪
でも、応募資格は35歳以下です、、、
2022年12月から説明会が土曜日開催が追加されていますよ♪
説明会では、希望者に対してプログラミング体験もできるよ♪

未経験者からプログラマーを目指すのに最適かと、
まずは無料カウンセリングから♪

カリキュラムとサポートがしっかりしています、
お得なキャンペーンとかいろいろやっています♪

ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適かと、
まずは無料オンライン相談から♪

コメント欄