sola's note

sola's note

日ごろのメモを書いていきます。何か新しいものを作るために。

Amebaでブログを始めよう!
作ったアプリ(を改造したやつ)が
東北×岐阜=シナジー スマートフォンアプリコンテスト
http://www.tohoku-gifu.com/

の一次審査通りました!拍手っ!
読み間違えてなければ、現時点で上位10作品の中ということになります。

2/19に岐阜のソフトピアジャパンドリーム・コア2Fメッセ
でプレゼンすることになりました。

また結果が出たら書かせてもらうかもしれません。
ちなみにベースとなったアプリはこれ↓です。

写真共有アプリ -MySnap-
https://play.google.com/store/apps/details?id=net.jp.found.mysnap

写真の共有に焦点を絞ったアプリです。
ネットを通しての共有は勿論ですが、スマホを相手に見せることも考慮してます。
まだまだ機能はシンプルですが、良ければ使って見てください。
久しぶりに純粋なJavaネタ

とあるリスト内オブジェクトの特定の値(今回はLong)の重複を検出・排除したかったけど、
Listのcontainsとかのアルゴリズムが不明だったので、シンプルに数通り処理速度のテストをしてみた。

やったのは次の3通り


パターン1:リスト内のオブジェクトをequalsで1つずつ比較

for (int i = 0; i < list.size() - 1; i++) {
    for (int j = i + 1; j < list.size();) {
        if (list.get(i).getId().equals(list.get(j).getId())) {
            list.remove(j);
        } else {
            ++j;
        }
    }
}

パターン2:ArrayListのcontainsメソッドを利用して比較

List<Long> cList = new ArrayList<Long>();
for (int i = 0; i < list.size() - 1;) {
    if (!cList.contains(list.get(i).getId())) {
        cList.add(list.get(i).getId());
        ++i;
    } else {
        list.remove(i);
    }
}

パターン3:HashSetのcontainsメソッドを利用して比較

HashSet<Long> hs = new HashSet<Long>();
for (int i = 0; i < list.size() - 1;) {
    if (!hs.contains(list.get(i).getId())) {
        hs.add(list.get(i).getId());
        ++i;
    } else {
        list.remove(i);
    }
}


結果は・・・

■比較対象のリストが1,000件の時
[1回目]
パターン1:14ミリ秒
パターン2:5ミリ秒
パターン3:2ミリ秒

[2回目]
パターン1:21ミリ秒
パターン2:6ミリ秒
パターン3:2ミリ秒

[3回目]
パターン1:22ミリ秒
パターン2:6ミリ秒
パターン3:2ミリ秒

■比較対象のリストが10,000件の時
[1回目]
パターン1:311ミリ秒
パターン2:132ミリ秒
パターン3:15ミリ秒

[2回目]
パターン1:315ミリ秒
パターン2:125ミリ秒
パターン3:13ミリ秒

[3回目]
パターン1:309ミリ秒
パターン2:128ミリ秒
パターン3:13ミリ秒

■比較対象のリストが100,000件の時
→なかなか終わんない
パターン1:54,337ミリ秒
パターン2:46,686ミリ秒
パターン3:92ミリ秒


所感?として100,000回の場合はなかなか終わりませんでしたが、
パターン1の処理件数が階乗となっているので、仕方ないのかなと。
ただ、処理件数が増えてくるとパターン2も処理時間の増加がかなりあるので、
「重複の確認」にはアルゴリズム的には合っていないようです。

結論としては、
今回やった3通りの中では、圧倒的にHashSetがベストという結果に。