2010-12-28 3 views
0

예를 들어 Eric이라는 이름의 사람을 등록하려고 시도한 다음 Eric을 다시 등록하면 작동합니다. 이것은 내가 가진 코드에서 일어나서는 안된다. 이미 Eric이 목록에 등록되어 있다면 Eric을 등록해서는 안됩니다. 여기에 내 전체 코드입니다 :java-register problem

 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)) 

는 "=="비에 대한 참조 평등이다 싶어 - 우선 유형. name (즉, 해당 주소 인 경우)은 getName()에 의해 반환 된 개체에 대한 참조와 동일하지 않습니다.

은 참조 : http://www.java-samples.com/showtutorial.php?tutorialid=221

+0

+1 잘못된 코드 부분을 가져 오는 경우. 그러나 코드의 디자인도 잘못되었습니다 (내 포스트 참조). 그리고 _that_를 수정 한 후에는 더 이상 수동으로 이름을 비교하지 않으므로이 문제가 해결되지 않습니다. –

+0

나는 여기에 웜의 깡통을 열어서 조심하는 경향이 있지만, 당신은 절대적으로 옳습니다. –

2

브라이언의 대답은 올바른 것입니다. 그러나 "나무 대신 숲"수준에서 코드의 디자인도 수정해야합니다.

정렬 된 이름 모음이 필요하며 기존 이름을 검색하려면 TreeMap을 사용해야합니다. ArrayList (삽입 할 때마다 정렬해야 함)은 완전히 잘못된 데이터 구조입니다.

+1

또는'TreeSet'. 또는 'HashSet'. 물론, 5 명 정도의 사용자가있는 경우라면 그다지 중요하지 않습니다. –

+0

@Brian : +1 예, 맞습니다. 'TreeSet'도 좋습니다. 이름으로 키잉 된 맵을 사용하면 자연스러운 순서를 사용할 수 있으며 사용자 정의 비교기를 작성할 필요가 없습니다. ('HashSet'는 일반적인 경우에 좋지만, 여기에서는 OP가 이름순으로 정렬 된 항목을 원합니다.) –