Java

複数キーを持つハッシュデータ

More than 3 years have passed since last update.

http://www.atmarkit.co.jp/fjava/javatips/081java010.html

作り方自体はもうこれ書いてあるままじゃねえか!という話でしか無いんですけど


hashdata.java

Map<String, Map<String,Integer>> map = new HashMap<String, Map<String,Integer>>();

map.put("京都", new HashMap<String,Integer>());
map.get("京都").put("舞鶴", 10000);
map.put("東京", new HashMap<String,Integer>());
map.get("東京").put("渋谷", 1000);
map.get("東京").put("秋葉原", 2000);

これでHashMapを値に持つHashMap(分かりづらい)が出来る。

複数キーを使うときはgetを2個重ねればOK。

ここから本題。


1つ目のキー(サンプルでは都道府県)が同一なデータをすべて取り出す、といった操作が容易に行えるという特徴があります。


String[] tokyo = map.get("東京").keySet().toArray(new String[map.get("東京").size()]);

これで東京を1つ目のキーに持つデータを配列として扱うことが出来る。


とまあ書いたわけなんですが、脳みそが筋肉でできているぼくは「よーし、東京のデータを取り出しちゃうぞ」って思った時に

System.out.println(map.get("東京"));

とかやってみたんですけど {秋葉原=2000, 渋谷=1000}

って当然ながらHashMapで返ってくるんですよ。

順番バラバラになってて嫌だったからLinkedHashMapとかに変更してみたりしても現実逃避に過ぎなかったんですよね。

ちょっと脳筋すぎたから「戻り値Stringのやつを選べばいいんじゃね」とか思ったりしながらムキムキしてたけど明後日すぎたわけで。

で、落ち着いてさっきの出力結果を見なおしたら東京を1つ目のキーに持つHashMapにおけるKeyと値の組み合わせ(くどい)なんですよね。

あれ? こいつのKey一覧取得すればいいだけじゃね? とようやく気付いてkeySetを試したら出るわ出るわ。

んで、Set型で帰ってくるから、最終的にtoArrayを使ってString型の配列にぶち込んで終了。