我正在尝试使用for-each循环在我的方法findContactsByName中搜索包含在ArrayList中的String,如果在Contact中找到String,则返回Contact,如果找不到String,则返回null退回。但是,在测试我的代码时,会一直返回null,这是我的代码:
import java.util.*;
public class Phonebook {
private String owner;
private ArrayList<Contact> contacts = new ArrayList<Contact>();
public void addContact(Contact contact) {
contacts.add(contact);
}
public void show() {
System.out.println(owner + "'s phonebook");
for (Contact contact : contacts) {
System.out.println(contact);
}
}
public Contact findContactByName(String name) {
for (Contact contact : contacts) {
if (contacts.contains(name)) {
return contact;
}
}
return null;
}
}
答案 0 :(得分:3)
您的findContactByName方法不正确。您正在循环遍历ArrayList,但是您使用ArrayList.contains
检查数组列表的每个循环,它将列表本身中的对象与name
进行比较。
正确的方法是:
public Contact findContactByName(String name) {
for (Contact contact : contacts) {
if (contact.getName().equals(name)) {
return contact;
}
}
return null;
}
假设Contact
对象有一个名为getName
的方法。请注意我在每个循环中如何使用contact
的for循环中的(Contact contact : contacts)
而不是ArrayList本身。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
使用contains的示例是
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
类具有名称变量。
希望你理解它。
答案 3 :(得分:0)
除非特别要求使用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);
}
}
此外,搜索变为索引,因此更快。