2014-01-23 3 views
1

Я распечатываю поиск ключа и ключи на карте, и они есть, но назначение не выполняется. Я тестирую, заполняя карту одним объектом и повторяя и распечатывая ключи. Ключ, на который я ссылаюсь, есть, поэтому я не вижу, как temp имеет значение null?Почему ключ не найден в hashmap?

Birds temp = (Birds)hint.get(input.substring(0, input.length()-1).trim());//the last char is being dropped off on purpose 
    if(temp == null) 
    { 
     System.out.println("failed to map key"); 
     Iterator entries = hint.entrySet().iterator(); 
     while (entries.hasNext()) { 
      Map.Entry thisEntry = (Map.Entry) entries.next(); 
      System.out.println("Key1: "+ 
       thisEntry.getKey()); //this an next line printout the same 
      System.out.println("key2: "+ 
       input.substring(0, input.length()-1).trim()); 
     } 
    } 

Я добавил следующие строки в классе птиц, но по-прежнему та же проблема

@Override public int hashCode() 
    { 
     return name.hashCode(); 
    } 

@Override 
public boolean equals(Object obj) { 
    Bird b = (Bird)obj; 
    String str = b.name; 
    if(str.compareTo(this.name) == 0) 
     return true; 
    else 
     return false; 
} 

Оказался белое пространство завинчивания вещи, и я не звала trim() достаточно часто.

+1

Вы определили свой метод .hashCode() и .equals() для птиц? – JustinKSU

+2

Ключи кажутся строками, а .hashCode() и .equals() не имеют значения для значений. –

+0

@JustinKSU Nope !! Что это? Я последовал за этим (http://www.tutorialspoint.com/java/util/hashmap_get.htm). – Celeritas

ответ

7

Когда вы вызываете substring, имейте в виду, что конечный индекс не включен в подстроку.

подстрока начинается с указанного beginIndex и продолжается до символа с индексом endIndex - 1

В вашем вызове

input.substring(0, input.length()-1) 

вы на самом деле берет последний символ прочь все, что в настоящее время в input. Итак, если у вас есть ключ "finch", вы неосторожно просматриваете ключ "finc".

Я не вижу причины для звонка substring; удалить его:

Birds temp = (Birds) hint.get(input.trim()); 

Кроме того, приведение к Birds были бы не нужны, если вы указали общие параметры типа к вашему HashMap, что-то вроде этого:

Map<String, Birds> hint = new HashMap<>(); 

Тогда при вызове получить, вам больше не нужно литье:

Birds temp = hint.get(input.trim()); 
Смежные вопросы