この記事は 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を習得するのに最適かと、
まずは無料オンライン相談から♪
参考になったら、💛をポッチとしてね♪