Возвращение значение по указному ключу

153
04 июня 2019, 11:10

В Map, в качестве ключа, я хочу искользовать собственный объект, ну положим Item, с переопределёнными методами hashCode и equals. Но когда я хочу получить значение, ранее положенное в Map я получаю null, в качестве примера привожу код. Вопрос собственно в том, как можно реализовать код класса Item, чтобы в итоге Map мне вернул значение по указанному ключу?

public class Item {
    private Integer item;
    public Item(Integer item) { this.item = item; }
    public void setItem(Integer item) { this.item = item; }
    public Integer getItem() { return this.item; }
    public int hashCode() { return item * 31; }
    public boolean equals(Item item) { return this.hashCode() == item.hashCode(); }
    public String toString() { return item.toString(); }
}
public class Test {
    public static void main(String ... argv) {
        Map<Item, String> map = new HashMap<Item, String>();
        map.put(new Item(2), "test");
        System.out.println(map.get(new Item(2))); // Возвращает null
    }
}
Answer 1

Ваша проблема в том, что вы не переопределили метод equals. В классе Object метод имеет сигнатуру

public boolean equals(Object obj)

А вы создали свой метод equals со своей сигнатурой. Если вы пометите свой метод equals аннотацией @Override компилятор выдаст ошибку по этому поводу. Следовательно измените метод equals в классе Item на

@Override
public boolean equals(Object obj)

и у вас всё заработает )

Answer 2
@Override
public int hashCode() { return item * 31; }

и так далее

READ ALSO
Java нужна перменая типа double [дубликат]

Java нужна перменая типа double [дубликат]

На данный вопрос уже ответили:

152
Плагин для eclipse, использующий qt

Плагин для eclipse, использующий qt

Имеется некое оконное приложение написанное с помощью QtЕсть ли возможность встроить его в eclipse? Я знаю, что плагины для него можно писать...

119