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
とのことなので,そのあたりの評価はとってない.今後の課題とさせていただきます.