내 연락처에서 String이 발견되면 연락처에 대해 각 for 루프를 사용하여 findContactsByName 내 메서드에서 ArrayList에 포함 된 String을 검색하려고합니다. String가 발견되지 않는 경우는 null가 돌려 주어집니다. 그러나 내 코드 null을 항상 테스트 할 때 내 코드는 다음과 같습니다.String을 매개 변수로 사용하여 ArrayList를 선형 검색
답변
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 루프를 사용하는 방법에 주목하십시오.
null-safe가 아닙니다. Objects.equals (contact.getName(). name)를 선호합니다. –
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;
}
예 사용하는 것입니다
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
를 사용하는 것은 특별히 필요한 경우를 제외하고
, 난 당신이 더 나은 가 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);
}
}
또한, 검색이을 인덱싱함으로써, 신속하게 다음.
다음 명명 규칙을 따르십시오. '연락처'라는 '연락처'는 혼란 스럽습니다. 변수 이름은'contact'이어야합니다. –
개선 된 for 루프에서 –
자신의 ArrayList를 반복적으로 쓰는 대신에''HashMap''을 사용하는 것을 고려해보십시오 (연락처 : 연락처) 대신 클래스의 이름을 사용하지 않는 적절한 구현을 읽는 것이 더 쉽습니다. 변수 이름 .. – Javant