Sler系SEの技術ブログ

MapのKeyを任意のオブジェクトにする #Java #TreeMap #HashMap

kght6123

kght6123

MapのKeyを任意のオブジェクトにする #Java #TreeMap #HashMap

JavaのMapでKeyを任意のオブジェクトにします。

HashMapではequalshashCodeの対応、

TreeMapではcompareToの対応が必要です。

下記のサンプルでは、compareToを再利用してます。

public class Main {
  public static void main(final String... args) {
    // 利用例
    final Map<KeyInfo,String> map = new HashMap<>();
    map.put(new KeyInfo("ID1", 1), "value1");
    map.put(new KeyInfo("ID2", 2), "value2");
    System.out.println(map.get(new KeyInfo("ID2", 2))); // value2
  }
}

compareToの結果は等しい時は0、異なる時は0以外を表すので

equalsの結果にも再利用しています。

public class KeyInfo implements Comparable<KeyInfo> {
  private final String id;
  private final int type;
  
  // --- コンストラクタ、Getter/Setterは省略 ---
  
  @Override
  public int compareTo(final KeyInfo info) {
    // TreeMap向け メソッド
    if(StringUtils.equals(info.id, this.id)
        && info.type == this.type)
      return 0;
    else
      return -1;
  }
  @Override
  public boolean equals(Object arg0) {
    // HashMap向け メソッド
    if(arg0 instanceof KeyInfo && compareTo((KeyInfo)arg0) == 0) {
      return true;
    }
    return super.equals(arg0);
  }
  @Override
  public int hashCode() {
    // HashMap向け メソッド
    return HashCodeBuilder.reflectionHashCode(this, new String[]{}/*exclude*/);
  }
}

複数のシステムをまたがるデータを合わせ込む場合に、よく使うにゃー・・・