読者です 読者をやめる 読者になる 読者になる

hashmap的な構造でvalueからkeyを持ってくるデータ構造の紹介と利用

卒論はダメだが久々になんかアウトプットしたくなったので書く.

概要

AndroidでHashmapを使ってKeyValueなデータを管理してたのだけど, データいじってる時にValueからKeyを引きたくなる事案に遭遇した. 今回管理してたKeyValueは1対1であることが保証できたので,最初はforで回して適当に拾えばいいかとおもったけどぐぐったらBiMapなる便利なCollectionがあるらしいので使ってみた. そしたら今度はメソッドが多くなりすぎてapk吐けなくなった. しかし,MultiDexApplicationを利用したらたくさんclassあってもapk出せた. そしてうまいこと動作してめでたしめでたし.

背景

ValueからKeyを引っ張ってこれるデータ構造ほしい(Java) KeyValueが1対1であることが保証できればforとかで舐めればいいけど,たくさんデータあると大変. なんかKeyValue反転とかできたら便利

関連技術

ここでは関連する技術について述べる

Guava

Guava[1]はGoogleが開発している色々便利なデータ構造とか処理を書いたライブラリのこと. 今回はこの中に実装されているBiMapを利用した. BiMapはKeyValueなデータ構造なんだけど,inverseっていうメソッドが実装されていて,これを使えばKeyとValue反転できる.そして逆に検索可能.便利. しかしこのライブラリは巨大過ぎるゆえにクラス数,メソッド数が異常にある.

Multi Dex Support

Androidはアプリ内に定義されたメソッド数が65536を超えるとビルドできなくなる. そのための対策としてMultiDex[2]がある.まあひとつのファイルに65536詰められないなら,分ければいいやんみたいな発想.具体的には参考文献を参照のこと

実装

BiMapの利用

nini_y氏[3]はBiMapについて解説している.

BiMap<Integer, String> biMap = HashBiMap.create(); // newではない

biMap.put(0, "hogehoge");
biMap.put(1, "foofoo");

biMap.get(0); // -> "hogehoge"

biMap.inverse(); // -> BiMap<String, Integer>が得られる
biMap.inverse().get("foofoo"); // -> 1

MultiDex

このままだとメソッド数が多すぎてapk出せなくなるので,MultiDexすることで回避する. chuross氏[4]はメソッド数が多すぎることに対するMultiDexについて解説している. 以下Android Studioでの対応を記載する.

// build.gradle 

android {
    ...
    defaultConfig {
        ...
        multiDexEnabled true
    }
    ...
}

dependencies {
  ...
  compile 'com.android.support:multidex:1.0.0'
  ...
}

Applicationクラスを利用している場合

class MyApplication extends MultiDexApplication{
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

Applicationクラスを利用していない場合はAndroidManifest.xmlにMultiDexApplicationを追記してもよい

<application 
        android:name="android.support.multidex.MultiDexApplication">
</application>

評価

動いた

考察

便利

終わりに

俺は一体何をしているんだ.

参考文献

[1] google/guava https://github.com/google/guava

[2] Building Apps with Over 65K Methods | Android Developers http://developer.android.com/tools/building/multidex.html

[3] com.google.common.collect.BiMapを試す http://yy.hatenablog.jp/entry/2013/05/07/221421

[4] Androidメソッド数が65k(65536)を超えた場合にビルドができなくなる問題の対処法 http://qiita.com/chuross/items/c874e5058aa5847e1b98

追記

MultiDexするとめっちゃビルド遅くなる気をつけて.

とのことなので,そのあたりの評価はとってない.今後の課題とさせていただきます.