クラスライブラリ基礎

セットとマップ

今回は「改訂第2版 Java言語プログラミングレッスン(下)」を参照します。 この本に掲載されているサンプルプログラムは著者のサイトからダウンロードできますが、 文字コードが Shift JIS であるため、UTF-8 に変換したものを以下に置いておきます。

セット

セット(set)とは、数学で出てくる集合のことです。集合の特徴は以下のとおりです。

Java の Collections Framework では、集合を表す Set インタフェースが用意されています。 また、Set インタフェースを実装しているクラスで最もよく使われるクラスとして、 HashSet があります。

Set インタフェースにおける基本の操作は add, remove, contains, size です。 HashSet はこれらのメソッドを効率よく実行することができます。

リストとの比較で注目すべき点は、contains メソッドや、 オブジェクトを指定する remove メソッドが高速に実行できる点です。 リストの場合には先頭から線形探索をしていく必要があるため重たい処理になりますが、 HashSet ではハッシュ法(次週学びます)によって直接アクセスすることができるため、 大きな差があります。 要素の順序づけが必要なく、 あるオブジェクトが集合に含まれているかを確認することが多い場合には、 リストではなくセットを用いるとよいでしょう。

一方、HashSet は要素に順序がないにもかかわらず Iterator を利用することができますが、 ArrayList ほど高速に繰り返しが実現できるわけではありません。

マップ

マップ(map)は、キー(key)と値(value)の組を保存する構造です。 キーも値もオブジェクトであればなんでもかまいません。 このキーと値の組のことをエントリと呼びます。

マップに対して、キーを指定して対応する値を得ます。 例えば、キーとして「東京電機大学」、 値として「東京都足立区千住旭町5番」を登録しておけば、 いつでも大学名を指定して住所を得ることができます。 非常に便利で活躍する場面の多いデータ構造です。

Map インタフェースの実装としては HashMap があります。 HashMap では、キーから高速に値を取り出すアルゴリズムとして、 ハッシュ法を用いています。

1つのマップに登録されているエントリのキーの一覧を知りたいことがあります。 キーの集合は、メソッド keySet で取り出すことができます。 キーを一つ一つ取り出すには、このキーの集合に対する Iterator を用います。

エントリ(キーと値の組)の集合を取り出す entrySet というメソッドもあります。 取り出したエントリに対して getKey, getValue というメソッドを用いることで、 キーや値を得ることができます。