IDによって管理されているデータベース上のデータのように、キーと値が対となるデータを扱わなければならないことはよくあります。そのようなときは、コアAPIのjava.utilパッケージにある、HashMapクラスやDictionaryクラスを利用するのが一般的でしょう。
しかし、2つのキーの組み合わせで値が特定されるようなデータにも直面することがあります。例えば、各都道府県の年齢別人口といったデータでは、「都道府県」と「年齢」という2つのキーによって、人口を特定しなくてはなりません。
このような2次元のキーを持つデータを扱うときは、どのクラスを使えばいいのでしょうか? HashMapクラスやDictionaryクラスは、1つのキーだけで値を一意に特定できるデータには問題なく使えますが、このようなデータはうまく処理することができません。実際のところ、複数キーを持つデータを扱うためのクラスは、コアAPIには用意されていません。従って、複数キーを持つデータを扱えるようなオブジェクトを、自分で用意する必要があります。
本稿では、2次元のキーを持つデータを作成する典型的な方法を2つ紹介します。どちらも、コアAPIにあるクラスのインスタンスを組み合わせることで実現します。
まず、java.util.HashMapを2回用いる方法です。アイデアとしては、HashMapの値をさらにHashMapオブジェクトにすることで、2次元キーのデータを表現する、というものです。
以下は、HashMapを2回用いた方法のサンプルコードです。ここでは、先ほど例に挙げた各都道府県の年齢別の人口を、2次元キーのデータとして表現しています。「東京都」「25歳」という2つのキーに対し、「234567人」という値を対応付けています。
package net.mogra.wings.javatips; |
このサンプルコードの実行結果は次のとおりです。
> javac net\mogra\wings\javatips\TwoKeysMap.java |
この方法では、2次元キーのデータを表すHashMapオブジェクト(サンプルではtwoKeysMap)が、値としてHashMapオブジェクトを持つことを常に意識しながらコードを書かなくてはならないため、多少の注意が必要になります。一方、1つ目のキー(サンプルでは都道府県)が同一なデータをすべて取り出す、といった操作が容易に行えるという特徴があります。
もう1つは、java.util.ArrayListとjava.util.HashMapとを用いる方法です。アイデアとしては、キーをArrayListオブジェクトにすることで、キーの多次元性を表現するというものです。
こちらの方法のサンプルコードは、以下のようになります。例として取り上げているデータは、前述のTwoKeysMap.javaと同じものです。また、実行結果もTwoKeysMap.javaと同様です。
package net.mogra.wings.javatips; |
こちらの方法では、キーの多次元性をArrayListオブジェクトで表現しているため、ハッシュデータそのものは単なるHashMapオブジェクトとして扱え、操作が直感的で容易です。一方、1つ目のキーが同じデータをすべて取り出すという操作は、最初に紹介した方法に比べるとかなり難しくなります。
どちらの方法を採用するかは、そのデータを使ってどのような操作をするかによって、適切に選択すればよいでしょう。また、どちらの方法にしても、少し応用するだけで、キーを3つ以上持つような多次元キーのデータ表現へ、簡単に拡張することができます。
本稿では、既存のコアAPIのクラスのインスタンスを組み合わせることで、2次元キーのデータを扱う方法を紹介しました。しかし、システムの中でこのようなデータ構造が頻繁に使われたり、あるいは、それがシステムの中で特定の意味を持っているようであれば、新たなクラスを用意することをお勧めします。もちろん、そのようなクラスは、ここでご紹介した方法を応用して実装することができます。
Copyright © ITmedia, Inc. All Rights Reserved.