2010-12-28 3 views
0

Когда я пытаюсь зарегистрировать человека с именем Eric например, а затем снова регистрирую Eric, он работает. Это не должно происходить с кодом, который у меня есть. Эрика не следует регистрировать, если в списке уже есть Эрик. Вот мой полный код:java - зарегистрировать проблему

 private Person findName(String name) { 
     for (Person person : personer) { 
      if (person.getName() == name) { 
       return person; 
      } 
     } 
     return null; 
    } 





private boolean containsName(String name) { 

     return findName(name) != null; 

} 

ответ

2

Ваша проблема с этой линией:

if (person.getName() == name) 

Вы хотите

if (person.getName().equals(name)) 

В Java, "==" является ссылкой равенства для не -примитивные типы. Ссылка на name (то есть его «адрес», если хотите) не совпадает с ссылкой на объект, возвращаемый getName().

Смотрите также: ответ http://www.java-samples.com/showtutorial.php?tutorialid=221

+0

+1 для получения неправильной части кода. Однако дизайн кода неверен (см. Мой пост), и после исправления _that_ больше нет ручных сравнений имен, поэтому эта проблема не возникает. –

+0

Я, как правило, опасаюсь открыть здесь эту червь, но вы абсолютно правы. –

2

Брайана является правильным. Тем не менее, на уровне «лес вместо деревьев» необходимо также исправить дизайн кода:

Если вам нужна коллекция отсортированных имен и вы можете искать существующие имена, вы должны использовать TreeMap. ArrayList (который вы сортируете по каждой вставке, не менее) - это совершенно неправильная структура данных для этого.

+1

Или 'TreeSet'. Или даже «HashSet». Конечно, если у вас всего лишь пять пользователей или около того, все это не так важно ... –

+0

@Brian: +1 Да, вы правы, «TreeSet» тоже хорош, хотя используя карту, введенную по имени, вы можете просто использовать естественный порядок и не должны писать пользовательский компаратор. ('HashSet' отлично подходит в общем случае, но здесь OP хочет отсортировать элементы по имени.) –

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