使用String作为参数在ArrayList上进行线性搜索

时间:2016-07-29 14:22:05

标签: java bluej

我正在尝试使用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;
    }
}

4 个答案:

答案 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);
    }
}

此外,搜索变为索引,因此更快。