当メモは2009-01-16に投稿されたものを加筆修正し、再掲したものです。
目次
手っ取り早く複数のキーを指定する
java.util.Map
のキーとして複数のキーを手っ取り早く指定するには、Stringが格納されたjava.util.ArrayList<String>
あたりをキーにするとよいです。
これは、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()
を利用して、同一性を判定しています。(#compareTo()
が0を返すと同じインスタンスと判定します。それ以外だと違うインスタンスと判定します。)
ということなので、上で紹介したHashMap
などの例ではjava.util.ArrayList
をキーとして使えるのですが、
java.util.ArrayList
はjava.lang.Comparable
でないので、java.util.TreeMap
のキーとしては使えません。
また、自作したクラスにjava.lang.Comparable
インタフェースを実装してjava.util.TreeMap
のキーとして使用する場合はこの判定方法に注意して下さい。
参考
元記事
- [元記事(https://npnl.hatenablog.jp/entry/20090116/1232123160)