こんばんは!ヒカリです。
Webエンジニアを目指してプログラミングを勉強している初心者の方向けに情報を発信しています。
今流行の仮想通貨を自動売買してみました!
リモートワークでおすすめのグッズ紹介してみました!
今回はこのような質問をいただきました。
MapのvalueにList入れるのめんどくさいな…
MapのvalueにListを入れる場合、ちょっと面倒ですよね。
そこで今回はこちらの質問について解説していきます!
環境
- Java 11
- Play Framework 2.6
- IntelliJ IDEA ULTIMATE 2019.2
GuavaのMultimapで解決!
結論から言うと、GuavaのMultimapというもの利用することで簡単に実装できます。
ただ、
このためにGuavaを導入するのはちょっと…
という人もいると思うので、独自に作ってみました!
MapのvalueにListを入れる場合、ちょっと面倒ですよね。
- Mapを用意する
- 値のListに1つ追加する
- 初回はListを初期化する
- 2回目以降はそのまま追加する
みたいなことをする必要があります。
毎回、分岐処理を書くのも面倒なので共通化しましょう!
値を渡せばいい感じに追加してくれるメソッド!
/**
* map の key の List に value を追加して map を返す
* @param map 追加対象のMap
* @param key 追加するキー
* @param value 追加する値
* @param <K> キーの型
* @param <V> 値の型
* @return 値を追加したMap
*/
public static <K, V> HashMap<K, List<V>> add(HashMap<K, List<V>> map, K key, V value) {
List<V> list = map.get(key);
if (Objects.isNull(list)) {
list = new ArrayList<>();
}
list.add(value);
map.put(key, list);
return map;
}
使い方
- map:値を追加するMapを指定してください。このMapの値(List)にvalueを追加したものが戻り値となります。
- key:追加したいkeyを指定してください。
- value:Listに追加したいvalueを指定してください。
使ってみた!
HashMap<String, List<String>> map = new HashMap<>();
map = add(map, "a", "12345");
map = add(map, "a", "123");
map = add(map, "b", "246");
map.forEach((key, value) -> System.out.println(key + " は " + value + " です"));
a は [12345, 123] です
b は [246] です
初回の追加でも何も考えずに追加できるのでいいですね!
あとがき
Enumのように、決まっている値がキーであれば最初にすべて初期化すると楽ですね。
今回のような処理も不要だと思います。
メソッドの引数の参照渡しができたらもっと使いやすくなるけど、Javaだとできないっぽい。
戻り値を設定するしか方法はないのかなぁ。