HashMap のキーに自作クラスを使うには
以下のように自作のクラスを定義して,HashMap
class CoPair { String s1; String s2; .... }
この場合,CoPair クラス内で equals(CoPair cp) と hashCode() の2つのメソッドを
オーバーライドしなければならない.詳細は
エンタープライズIT日記 HashMapのキーに自作クラスを使う場合の注意点
を参照のこと.
自分の思い込み
HashMap.get()が内部的に equals() を呼び出すと知っていたから,当初は equals() のみ定義していたが,これだけでは equals() が呼ばれない.
上記 Webページを参考にインプリしたコード
class CoPair { String s1; String s2; void set(String s1, String s2){ this.s1 = new String(s1); this.s2 = new String(s2); } boolean equals(String s1, String s2){ //入れ替えも含めて一致すれば OK if((this.s1.equals(s1) && this.s2.equals(s2)) || (this.s1.equals(s2) && this.s2.equals(s1))){ return true; } else { return false; } } @Override public boolean equals(Object cp){ if(cp instanceof CoPair == false) return false; //入れ替えも含めて一致すれば OK if((this.s1.equals(((CoPair)cp).s1) && this.s2.equals(((CoPair)cp).s2)) || (this.s1.equals(((CoPair)cp).s2) && this.s2.equals(((CoPair)cp).s1))){ return true; } else { return false; } } @Override public int hashCode() { return s1.hashCode()+s2.hashCode(); } @Override public String toString(){ String s; s = "(" + s1 + "," + s2 + ")"; return s; } }