LoginSignup
27
31

More than 5 years have passed since last update.

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

Posted at

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

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型の配列にぶち込んで終了。

27
31
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
31