プログラミング応用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 を返す。