No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

JavaでMapに複数のキーを指定する方法

手っ取り早く複数のキーを指定する

java.util.Mapのキーとして複数のキーを手っ取り早く指定するには、java.util.ArrayListあたりをキーにするとよい。
これは、java.util.ArrayListインスタンスが異なっても、格納されている要素が同じ場合は適切なハッシュコード(#hashCode())と#equals()による同一性が保証されるためです。

// "a", "b", "c" という3つの文字列を
// キーとするListを用意する
List<String> key1 = new ArrayList<String>();
key1.add("a");
key1.add("b");
key1.add("c");

// key1でmapに "hoge" を詰める
Map<List, String> map = new HashMap<List, String>();
map.put(key1, "hoge");

// key1と同じ内容のListを用意する
List<String> key2 = new ArrayList<String>();
key2.add("a");
key2.add("b");
key2.add("c");

// key2で "hoge" が取得できる
String result = map.get(key2);
assert result.equals("hoge");

// 内容が違うListを用意する
List<String> key3 = new ArrayList<String>();
key3.add("a");
key3.add("b");
key3.add("d"); // c → d に変更すると…
   
// key3で "hoge" は取得できない
result = map.get(key3);
assert result == null;

注意点

ここにも書いてありますが、java.util.TreeMapの場合、キーとして指定できる値がjava.lang.Comparableインタフェースを実装しているインスタンスを指定する必要があり、内部では#compareTo()を利用して、同一性を判定しています*1
ということなので、上で紹介したHashMapなどの例ではjava.util.ArrayListをキーとして使えるのですが、java.util.ArrayListjava.lang.Comparableでないので、java.util.TreeMapのキーとしては使えません。
また、自作したクラスにjava.lang.Comparableインタフェースを実装してjava.util.TreeMapのキーとして使用する場合はこの判定方法に注意してください。

*1:#compareTo()が0を返すと "同じインスタンス" と判定する。それ以外だと "違うインスタンス" と判定する。