Androidアプリ開発

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

この記事は約8分で読めます。
記事内に広告が含まれています。
スポンサーリンク

この記事は 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# などのオブジェクト指向言語が初めての方は、
書籍などによる独学ではアプリ開発できるようになるには、
かなりの時間がかかりますので、オンラインスクールでの習得をおススメします。

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

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

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

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

参考になったら、💛をポッチとしてね♪

スポンサーリンク
msakiをフォローする
スポンサーリンク
The Challenge of Second Life

コメント欄