複数キーのハッシュマップ

複数のキーから一意の値を取り出すようなハッシュマップ(java.util.HashMap)をもし作成したい場合、キー部分に複数キーを表現するようなオブジェクトを使うよりは、できるならば文字列連結で複数キーを表現してしまったほうがいい。*1

(あとから管理する者も簡単な仕組みのほうが管理が楽だろう。)

final String[] keys = ~~;

// 特別にキー用のクラスやオブジェクトを作成するより, 
// これぐらいで済ませてしまったほうがいい.
map.put(join(keys, '\uffff'), value); // '\uffff'はデリミタ. ありふれたものでなければなんでもよい


まあ、これはPerlの方式と同じわけだけれども。Perlでは複数キーのハッシュを、グローバル変数$;に定義されている区切り文字を挟んで表現する。

$hoge{'key1', 'key2'} = "value";
print $hoge{'key1', 'key2'}; // -> value
print $hoge{"key1${;}key2"}; // -> value
__END__
ちなみにord($;) == 28.

ってか、Perl結構忘れてる〜。もっかいラクダ本やるか〜

*1:ただし、毎回joinしてStringオブジェクトが新しく生成されているとString内部のprivateなハッシュ値の計算結果が保存されなくなるので、ちょっと遅くなります。気になる人はString#intern()するか、一般的なキー連結のクラス定義を書きましょう。