Think Twice
IT技術メモ | Javaのメモ
Created: 2009-01-16 / Updated: 2021-02-16

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


当メモは2009-01-16に投稿されたものを加筆修正し、再掲したものです。

目次


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

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

サンプルコード
Copy
// "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()を利用して、同一性を判定しています。(#compareTo()が0を返すと同じインスタンスと判定します。それ以外だと違うインスタンスと判定します。)

ということなので、上で紹介したHashMapなどの例ではjava.util.ArrayListをキーとして使えるのですが、
java.util.ArrayListjava.lang.Comparableでないので、java.util.TreeMapのキーとしては使えません。
また、自作したクラスにjava.lang.Comparableインタフェースを実装してjava.util.TreeMapのキーとして使用する場合はこの判定方法に注意して下さい。


参考

元記事

参考サイト