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などがあります。