2016-02-12 4 views
0

Я wana сравниваю строку с ключом хэш-карты.Как сравнить строку с ключом Hashmap?

Таким образом, каждый раз, когда я запускаю этот код он uotputs: Не найден

Я новичок в Java и его, конечно, мелочи, но мне нужна помощь.

Вот мой код

btnNewButton.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      if(!txtSearchHere.getText().isEmpty() && txtSearchHere.getText().length() > 1) 
      { 
       String value = txtSearchHere.getText(); 
       txtSearchHere.setText(""); 

       for(Integer key : plzHashMap.keySet()) 
       { 
        if(key.toString() == value) 
        { 
         System.out.println("Matched key = " + value); 
        } 
        else 
        { 
         System.out.println("Not found"); 
        } 
       } 
      } 
     } 
    }); 
+1

Используйте 'key.toString(). Равно (значение)' как '' == будет сравнивать, если это тот же объект (ссылка), тогда как '.equals()' сравнивает значения. – LordAnomander

+0

Попробуйте key.toString(). Equals (value) – anaxin

+0

Я думаю, что ваша логика неверна.Вы уверены, что хотите, чтобы ПОЛЬЗОВАТЕЛЬ вводил КЛЮЧ? Исходя из вашей переменной txtSearch, я предполагаю, что вы не предназначены для этого. – Peter

ответ

1

Для всех String-сравнений в Java вы должны использовать .equals() вместо ==.

Меняем:

if(key.toString() == value) 

к:

if(key.toString().equals(value)) 

Причина этого заключается в том, что == используется для проверки, если экземпляры таже (ссылка), в то время как .equals проверки для одинаковое значение.

See this SO question (among a lot of others) for more info

0

Попробуйте следующее:

String.valueOf(key).equals(value) 

И никогда не сравнивать строки с ==, используйте .equals().

0

Во-первых, сравнивать строки с помощью .equals(), не ==.

Во-вторых, он выдает Not found много раз, потому что это утверждение находится внутри цикла. Вы можете переместить его за пределы цикла:

  boolean found = false; 
      for(Integer key : plzHashMap.keySet()) 
      { 
       if(key.toString().equals(value)) 
       { 
        System.out.println("Matched key = " + value); 
        found = true; 
        break; 
       } 
      } 
      if (!found) { 
       System.out.println("Not found"); 
      } 

Однако, это было бы намного проще просто преобразовать value к Integer:

Integer intValue = Integer.parseInt(value); 

, а затем просто позвонить get и hasKey - не требуется подключение петлей:

if (plzHashMap.hasKey(intValue)) { 
    System.out.println("Matched key = " + plzHashMap.get(intValue)); 
} else { 
    System.out.println("Not found"); 
} 

конечно, вам нужно обрабатывать случай, value не может быть разобрано к n int.

0

== оператор проверяет для справки личность. Вы должны использовать equals методы для проверки равенства:

if(key.toString().equals(value)) 

Но независимо от того, что вы используете O (N) итерацию на HashMap, который был разработан, чтобы обеспечить O(1) просмотр ключа - почему бы не использовать его?

boolean found = false; 
try { 
    Integer integerValue = Integer.valueOf(value); 
    if (plzHashMap.containsKey(integerValue)) { 
     System.out.println("Matched key = " + value) 
     found = true; 
    }  
} catch (NumberFormatException ignore) { 
    // value is not even a number 
} 

if (!found) { 
    System.out.println("Not found"); 
} 
Смежные вопросы