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するとめっちゃビルド遅くなる気をつけて.
@programmerMOT 複数ファイルするとめっちゃロード長くなる
— らーめん (@aki017f) 2015, 1月 30
とのことなので,そのあたりの評価はとってない.今後の課題とさせていただきます.