HashMap - использование пользовательских объектов данных
Предположим, у меня есть HashMap:
HashMap<MyKey, Integer> HM = new HashMap<MyKey, Integer>();
MyKey соответствует объекту данных с двумя целочисленными элементами (и конструктором для передачи двух целых чисел).
HM.put(new MyKey(1,1234), 1); // this seems to work...
но я не могу использовать это:
System.out.println(HM.containsKey(new MyKey(1,1234)));
Я получаю ложь.
Может ли HashMap иметь пользовательский объект данных для ключа? Что мне не хватает? Спасибо...
2 ответа
Вы должны переопределить equals()
а также hashcode()
метод в вашем классе MyKey (или любой другой пользовательский класс в этом отношении, который вошел бы в HashMap или Set). Таким образом, когда вы говорите containsKey()
(или метод Setcontains()
, или же equals()
), вы бы явно указали, какие свойства MyKey проверять на предмет наличия или равенства.
Вы могли бы иметь простой equals()
а также hashCode()
такой метод в вашем классе MyKey
@Override
public boolean equals(Object o) {
boolean result = false;
if (o instanceof MyKey) {
MyKey mykey = (MyKey) o;
result = (this.getX() == mykey.getX() && mykey.getY() == mykey.getY());
}
return result;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + X;
result = prime * result + Y;
return result;
}
(Предполагая, что поля в вашем классе MyKey - X и Y)
В вашем System.out вы генерируете new MyKey()
, Вы хотите проверить, содержит ли ваш hashmap MyKey(1,1234)
не new MyKey(1,1234)
,