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),

Другие вопросы по тегам