Kanhiraその3、複数の辞書

※Kanhiraについては/tag/kanhiraを参照されたい。

これはKanhiraその2、辞書の構造の続きである。0.7から複数の辞書を扱えるようになった。

複数辞書の指定

以前のバージョンでは単一の辞書しか使用できなかったのだが、0.7以降は複数辞書を扱えるようになった。

    KanwaDict dict0 = ...
    KanwaDict dict1 = ....
    Kanhira kanhira = new Kanhira(dict1, dict0);

この場合Kanhiraコンストラクタにおいて先に記述された方が優先される。

この意図としては、テキストファイルを読み込んで作成される「かかし」辞書に加え、ユーザがデータベース等に自由に辞書登録を行い、それを「かかし」辞書よりも優先して引くということだ。

つまり、具体的には以下のように初期化する。

    KanwaDict dict0 = KakasiDictReader.load(/* InputStream */);
    KanjiYomiMap dict1 = new KanjiYomiMap();
    // dict1にDBなどから読み込む
    kanhira = new Kanhira((KanwaDict)dict1, dict0);

KanjiYomiMap

KanjiYomiMapはスレッドセーフなので、Kanhiraがdict1を利用している最中にaddやremoveで辞書メンテを行って構わない。

  /**
   * 漢字とそのよみを登録する。
   * 送り仮名の無い場合には"悪代官", "あくだいかん"のように登録すればよいが、送り仮名の
   * ある場合にはそれを半角小文字アルファベットにする必要がある。
   * 例えば、"悪名高い"の場合には"あくめいたかi"
   * @param kanji 漢字。例えば"悪名高"
   * @param yomi よみ。例えば"あくめいたかi"
   */
  public synchronized void add(String kanji, String yomi) {
  /**
   * 指定された登録を削除する。
   * 漢字だけではなく、よみも必要。
   * 例えば、同一の漢字でも「悪名高:あくめいたかi」、「悪名高:あくめいたかk」などと複数登録されていることがある。
   * @param kanji 漢字
   * @param yomi よみ
   * @return
   */
  public synchronized boolean remove(String kanji, String yomi) {