プログラミング応用b 第9回『コレクション2(イテレータ処理、Map、その他の代表的コレクションクラス)』


【マップ(Map)】

 配列は,添字番号という番号で要素を管理していた。しかし,多くのデータを扱うさに,
データの値で要素を管理(検索など)をしたい場合がある。例えば,成績データの場合,

  学籍番号 と 成績評価値

を組にし,

 J00123 と 80
 J00001 と 75
 J00080 と 90

というようなデータの組を登録しておき,学籍番号を指定すると対応する評価値が帰ってくる,
というような具合である。簡単なデータベースのようなものと考えれば良い。

通常,上例の学籍番号のような検索に用いる値をキー値(key)と呼ぶ。

このようなキー値とデータ値の組を登録し,キー値で検索して対応するデータ値を取得できる
ようなデータ構造をマップ(map)または連想配列と呼ぶ。


●TreeMap<K,V>

 もちろん,Javaにもマップが用意されている。しかも,実装方法等によって複数のマップクラス
が用意されているが,ここでは典型的な TreeMap<K,V> を紹介する。なお,ここで Kはキー値型,
Vは対応するデータ値型
を意味する。詳しいTreeMap<K,V>のドキュメントはこちらを参照すること。

※基本的に,TreeMap<K,V>では,同じキー値を持つ要素はただ1個のみ,という制限があることに注意。

TreeMap<K,V> の使用例 (TreeMapSample.java)

import java.util.TreeMap;

class TreeMapSample {

  public static void main( String [ ] args ) {

    TreeMap<String,Integer> tm = new TreeMap<String,Integer>();
    tm.put( "J00123", new Integer( 80 )); // キー値が "J00123" の要素を挿入
    tm.put( "J00001", new Integer( 75 )); // キー値が "J00001" の要素を挿入
    tm.put( "J00080", new Integer( 90 )); // キー値が "J00080" の要素を挿入
    System.out.println( tm ); // {J00001=75, J00080=90, J00123=80} と表示される。

    tm.put( "J00001", new Integer( 100 )); // キー値が "J00001" の要素のデータ値を更新
    System.out.println( tm ); // {J00001=100, J00080=90, J00123=80} と表示される。

    tm.remove( "J00080" ); // キー値が "J00080" の要素を削除。
    System.out.println( tm ); // {J00001=100, J00123=80} と表示される。

    System.out.println( tm.get( "J00123" ) ); // キー値 "J00123" に対応するデータを取得する。80と表示される。※Integer型の値はそのまま printlnメソッドで表示可能。
    System.out.println( tm.get( "J00999" ) ); // キー値 "J00999" に対応するデータを取得しているが,該当データが無いので getメソッドは null を返す。

  }
}


解説:
 ・7行目で,キー値をString型,対応するデータ値を Integer型とした TreeMap<K,V> 型オブジェクト tm を生成している。
 ・8〜10行目で,3個の要素を挿入している。putメソッドは,第1引数にキー値,第2引数に対応するデータ値を渡すと,
  指定されたキー値とデータ値を組とした要素をマップに登録してくれる。
 ・11行目でマップの内容を表示している。
 ・13行目で,キー値"J00001"のデータ値を更新している。このようにputメソッドは,既に登録されているキー値が渡された
  場合は,新たな要素を追加するのではなく,既存のデータ値の更新を行う(同じキー値を持つ要素は1腰か登録できないため)。
 ・16行目では,removeメソッドにキー値を渡して対応する要素をマップから削除している。
 ・17行目で,実際に1個要素が削除されたことが分かる。
 ・19行目では,getメソッドにキー値を渡して,対応するデータ値を取得している。
 ・20行目のように,getメソッドに渡されたキー値が登録されていないときは,getメソッドは null を返す。