2015-03-20 2 views
0

У меня есть действительно странная проблема. У меня есть простая карта, называемая векторами, где я храню StrategyPairs как ключи и Vectors как значения. Когда я печатаю это, я получаю этот результат:Значение карты Java map возвращает null

{[email protected]d7=(1.0;2.0), [email protected]85=(2.0;2.0), [email protected]75=(0.0;2.0), [email protected]e7=(2.0;1.0)} 

Как вы можете видеть [email protected] отображается в вектор (1,2). Теперь я создаю новый StrategyPair. Когда я печатаю его, я получаю [email protected] (тот же, что и раньше). Однако, если я сейчас звоню vectors.get(strategyPair), он возвращает null. Это как-то действительно странно, так как ключ один и тот же (по крайней мере, он печатает то же самое, когда я его печатаю)

Проблема возникает, когда я переименовываю стратегию, например. Я изменяю имя свойства в классе «Стратегия». Затем неожиданно карта, содержащая StrategyPairs (класс оболочки для двух стратегий), испорчена, как я объяснял ранее ...

EDIT: Когда я печатаю HashMap, я все равно получаю тот же результат, что и выше, но следующий код :

for(StrategyPair pair : vectors.keySet()) { 
      System.out.println(vectors.get(pair)); 
} 

возвращается: нуль (2,0; 2,0) нуль (2,0; 1,0)

+3

Какая карта? Как, по вашему мнению, карта должна идентифицировать два равных ключа? –

+0

@mathiasj Можете ли вы реализовать «toString()' в вашем классе «StartegyPair»? Возможно, что два элемента имеют одинаковый хэш, но не равны. –

+0

Вы переопределили равные и хэш-коды? – immibis

ответ

0

Как @Rajendra Gujja упоминается в комментарии, то «хэш-код клавиши не должны изменяться после вас держите их на карте ». Это очень верно; как только я изменил все хэш-коды, чтобы просто использовать UUID вместо изменяемого свойства name, проблема решена. Спасибо за все ваши ответы!

Смежные вопросы