2008/02/16 (Sat)

簡単なHashの作り方。

RubyのHashを作るのは早くて簡単。

name = {"title", "mr", "first", "craig", "last", "davidson"}

Javaでは通常以下のようになる。

public void testBuildAHashNormally(){

     Map slow = new HashMap();
     slow.put("title", "mr");
     slow.put("first", "craig");
     slow.put("last", "davidson");

     assertEquals("mr", slow.get("title"));
     assertEquals("craig", slow.get("first"));
     assertEquals("davidson", slow.get("last"));
}

それを以下のようにしてみたい。

public void testBuildAHashQuickly(){

     Map quick = new Hash("title", "mr",
                "first", "craig", "last", "davidson");

     assertEquals("mr", slow.get("title"));
     assertEquals("craig", slow.get("first"));
     assertEquals("davidson", slow.get("last"));
}

それは以下のようにHashを拡張すればいい。

public class Hash extends HashMap {
   public Hash(Object ... keyValuePairs) {
     for (int i=0; i<keyValuePairs.length; i++)
       put(keyValuePairs[i], keyValuePairs[++i]);
   }
}

2008/02/13 (Wed)

Case Insensitive

PostgreSQLでの検索を大文字小文字区別なしで行いたいとの事なので、 対応する演算子を捜したところ、以下の文章が見つかったのでテスト。

http://www.postgresql.jp/document/current/html/functions-matching.html

SELECT * FROM entry WHERE title ILIKE '%TEST%';
SELECT * FROM entry WHERE title ~~* '%TEST%';

LIKE と ~~ は等価、ILIKE と ~~* が等価のようだ。

~を一つにするとPOSIX正規表現を使ったマッチングになるようだ。 今回は部分一致の検索のみでいいので、TESTの値はプログラム側で キーワード(_や%)をエスケープ処理してSQLInjectionを防ぎ、 ILIKEを使い前後へのマッチングのみに対応した。