2015-04-03 4 views
0

Я сделал сообщение несколько дней назад об использовании HashMap в простой банковской программе, но у меня проблемы с использованием объектов как ключей.HashMap using Object as key

HashMap <Account,Client> HM = new HashMap<Account, Client>(); 
    HM.put(new Account(2193,"Uri"), new Client(2193,0,"Uri")); 
    HM.get(2193,"Uri"); 

Учетная запись и клиент являются классами в других частях источника. Моя проблема в том, что HM.get не работает должным образом и дает мне ошибку. Есть ли другой способ «получить» значение? Не знаете, как использовать ключ. Помните, что установка HashMap без ошибок.

Кроме того, есть ли лучший способ сделать это?

+0

вы реализованы на равных и метод Hashcode для класса Account? –

+3

вы добавляете объект учетной записи и пытаетесь получить целое число. это не сработает. – Pratik

+0

Вы используете объект в качестве ключа. Это будет hashcode вашего объекта, а не ваш фактический объект. – Nimesh

ответ

2

Это даст вам лучшую идею. поэтому вам нужно переопределить метод hashcode и equals.

Why do I need to override the equals and hashCode methods in Java?

После того, как переопределение и хэш-код равен метод.

вам нужно использовать свой объект, получая данные из hashMap.

HM.get(new Account(2193,"Uri")); 
+0

Если вы считаете, что другой вопрос SO отвечает на вопрос, вы должны отметить его как дубликат , а не просто создать ответ, указывающий на него. Более того, даже если переопределяет эти методы, его код не будет компилироваться. С другой стороны, даже без их переопределения, если правильно использовать 'get', в этом случае будет работать. –

+0

@MateuszDymczyk Спасибо за ваш совет. но я хочу, чтобы парень не знал о том, почему нам нужно переопределить hashcode и равен mehtod. поэтому поэтому я указываю лучший пример, чтобы он мог изучить основные основы. И вопрос другой, поэтому я не заметил его как дубликат и стараюсь дать ему возможность, чтобы он мог смотреть дальше, и то, как вы объясняете, действительно приятно. Спасибо за те моменты, которые вы упомянули. – Pratik

+0

В этом случае публикация этого комментария будет способом пойти или ответить на его вопрос и упомянуть об этом в ответе как побочную заметку. –

0

Прежде всего этот код не компилируется, как вы передаете 2 аргументы get(), который ожидает только один аргумент.

Этот аргумент должен быть в key вы используете в map и должен быть того же типа, который объявлен декларируя свою карту, в вашем случае HashMap <Account,Client> HM означает, что HM (которые кстати должны быть в нижнем регистре по соглашению) выполняется как ключей объектов типа Account и объектов типа Client в качестве значений.

Было бы компилироваться, если вы сделали:

get(2193) 

С get() принимает Object, но это было бы просто вернуть null.

Вам необходимо сделать get(new Account(2193,"Uri")).

Далее вам не нужно переопределить equals и hashCode в этих классах, но это высоко рекомендуется (другие уже указывали на ссылки говоря, почему). Также в соответствии с doc вы должны сделать ключи неизменными, чтобы они не менялись, иначе вы можете получить странное поведение.

Примечание: при использовании изменяемых объектов в качестве карты используются ключей. Поведение карты не указывается, если значение объекта изменяется таким образом, который влияет на сравнительные сравнения, а объект является ключом на карте. Частным случаем этого запрета является то, что недопустимо, чтобы карта содержала себя в качестве ключа. В то время как для карты должно быть указано , необходимо соблюдать предельную осторожность : методы equals и hashCode более не определены на такой карте.

Для более подробного описания интерфейса Map следовать Oracle's tutorial