2016-07-29 3 views
0

내 연락처에서 String이 발견되면 연락처에 대해 각 for 루프를 사용하여 findContactsByName 내 메서드에서 ArrayList에 포함 된 String을 검색하려고합니다. String가 발견되지 않는 경우는 null가 돌려 주어집니다. 그러나 내 코드 null을 항상 테스트 할 때 내 코드는 다음과 같습니다.String을 매개 변수로 사용하여 ArrayList를 선형 검색

+5

다음 명명 규칙을 따르십시오. '연락처'라는 '연락처'는 혼란 스럽습니다. 변수 이름은'contact'이어야합니다. –

+0

개선 된 for 루프에서 –

+0

자신의 ArrayList를 반복적으로 쓰는 대신에''HashMap''을 사용하는 것을 고려해보십시오 (연락처 : 연락처) 대신 클래스의 이름을 사용하지 않는 적절한 구현을 읽는 것이 더 쉽습니다. 변수 이름 .. – Javant

답변

3

findContactByName 메서드가 올바르지 않습니다. ArrayList를 반복하고 있지만 루프 목록 name을 사용하여 ArrayList.contains을 사용하여 배열 목록을 검사하는 각 루프가 반복됩니다.

올바른 방법이 될 것이다 이렇게하려면 다음 Contact 객체가 getName라는 메소드를 가지고 있다고 가정한다 그

public Contact findContactByName(String name) { 
    for (Contact contact : contacts) { 
     if (contact.getName().equals(name)) { 
      return contact; 
     } 
    } 
    return null; 
} 

. 각 루프에서 을 사용하여 루프의 (Contact contact : contacts) 대신 for 루프를 사용하는 방법에 주목하십시오.

+0

null-safe가 아닙니다. Objects.equals (contact.getName(). name)를 선호합니다. –

1
public Contact findContactByName(String name) { 
    for (Contact Contact : contacts) { 
     if (contacts.contains(name)) { 
      return Contact; 
     } 
    } 
    return null; 
} 

이 함수는 문제의 근본 원인입니다. if 블록의 상태는 다음과 같습니다. contacts.contains(name) 여기서 contacts은 전체 연락처 목록이며 문자열 개체를 찾고 있습니다. 그건 안돼. 연락처에 특정 이름의 연락처가 포함되어 있는지 확인하려고합니다. 그래서 뭔가가 : contact.getName().equals(name).

그래서 함수는 다음과 같이해야한다 : 포함

public Contact findContactByName(String name) { 
    for (Contact contact : contacts) { 
     if (contact.getName().equals(name)) { 
      return contact; 
     } 
    } 
    return null; 
} 
0

예 사용하는 것입니다

List<String> fruitsList = new ArrayList<>(); 
fruitsList.add("Apple"); 
fruitsList.add("Mango"); 
fruitsList.add("Grapes"); 

if(fruitsList.contains("Grapes")) { 
S.o.p("Found Grapes"); 
} 

하지만 경우에 당신은 당신의 DTO에서 특정 요소를 찾아 다시 반환해야 특정 이름이있는 경우 사용 사례는 다음과 같습니다.

public Contact findContactByName(String name) { 
    for (Contact contact : contacts) { 
     if ((null!=contact.getName()) && contact.getName().equals(name)) { 
      return contact; 
     } 
    } 
    return null; 
} 

Contact 클래스에는 name 변수가 있습니다. 당신이 그것을 이해하기를 바랍니다. ArrayList를 사용하는 것은 특별히 필요한 경우를 제외하고

0

, 난 당신이 더 나은 HashMap<String, Contact>로 교체 제안, 그래서 당신은 단순히 Map.get(key) 방법에 의존하여 처음부터 검색 알고리즘을 코딩 피할 수 있습니다. 맵은 어떤 키 (인덱스)에 의해 값을 검색하도록 구성된다

public class Phonebook { 

    private Map<String, Contact> contacts = new HashMap<String, Contact>(); 

    public void addContact(Contact Contact) { 
     contacts.put(contact.getName(), contact); 
    } 

    public Contact findContactByName(String name) { 
     return contacts.get(name); 
    } 
} 

또한, 검색이을 인덱싱함으로써, 신속하게 다음.