HashMapクラスでデータの格納や検索を行う
Hashtable classとほぼ同等の機能を持つクラスとしてHashMapがJDK1.2でリリースされました。
下のsampleではHashMapの内容は、プログラムID(String)とプログラムプロファイル(独自クラス)で、PrgProfileクラスには、
プログラム名と作成者が格納されています。
プログラム起動時に引数として渡されたプログラムIDを検索するプログラムです。
import java.util.*;
class ExamHashMap {
// args : ProgramID
public static void main(String[] args) {
HashMap hm = new HashMap();
hm.put("program1", new PrgProfile("prgName1", "Bill"));
hm.put("program2", new PrgProfile("prgName2", "Tobal"));
hm.put("program3", new PrgProfile("prgName3", "Duke"));
try {
PrgProfile pp = (PrgProfile)hm.get(args[0]); // get() method returns Object type
if (pp != null) {
System.out.println(args[0] + ":" + pp.getProfile());
} else {
System.out.println("No such program-ID");
}
} catch(ArrayIndexOutOfBoundsException ae) {
System.out.println("Argument was not entered.");
System.exit(-1);
}
}
}
class PrgProfile {
private String pname;
private String author;
PrgProfile(String pname, String author) {
this.pname = pname;
this.author = author;
}
public String getProfile() {
return (pname + " " + author);
}
}
|
実行結果
プログラムの起動時に”program1”と入力すると
program1:prgName1 Bill
プログラムの起動時に引数の入力を忘れると
Argument was not entered.
とコンソールに表示されます。
get() method
get() methodに渡すkeyはObject typeです。
argsはString typeですが、get() methodのなかではObject
typeとして扱われます。
これは親クラスへの型変換は、JVMが自動的に行うルールがあるためです。
一方get() methodの戻り値の型もObject typeです。
ここでは"(PrgProfile)"と記述し、明示的に型変換(cast)しています。
これは子クラスへの型変換は明示するルールがあるためで、明示しなければ、コンパイルエラーになります。
TreeMap class
HashMap classではkeyの昇順でデータを入手するメソッドはありません。これはHashMapがデータの順番を保証していないからです。
データをkeyの昇順で扱う事が可能なクラスはSortedMap
interfaceを実装したクラスで、TreeMap classなどがあります。