将IndexOf与arrayList中的customObject一起使用

时间:2016-08-26 22:41:48

标签: java arraylist indexof

我希望能够使用indexOf方法返回对象的位置,但只想传递联系人的名称来搜索这个,有什么方法可以做到这一点吗?

我目前有这种方法:

private static ArrayList<Contacts> contactList = new ArrayList<Contacts>();

public class Contacts {
private String name;
private String number;


public Contacts(String name, String number) {
    this.name = name;
    this.number = number;
}

public String getName() {
    return name;
}

public String getNumber() {
    return number;
}

public void setName(String name) {
    this.name = name;
}

public void setNumber(String number) {
    this.number = number;
}



public int findItem(String name) {

    return contactList.indexOf(name);
}

5 个答案:

答案 0 :(得分:2)

这是一个能够在不通过整个列表的情况下实现这一目标的函数,我认为复杂性小于O(n):

public int findItem(String name)
    {
        int max = contactList.size();

        //you might have to subtract this by one 
        //I'm not sure off the top
        int descCnt = max;


        for(int cnt = 0; cnt <= max/2; cnt++)
        {
            if(contactList.get(cnt).getName().equals(name)) return cnt;
            if(contactList.get(descCnt).getName().equals(name)) return descCnt;
            --descCnt;
        }

    }

答案 1 :(得分:1)

如果您按名称对Contacts进行了大量查找,则可以将实例放入Map<String, Contacts>Map的具体类型取决于您的要求; HashMap可能就足够了。

而不是contactList.add(contacts),您可以使用:

contactMap.put(contacts.getName(), contacts);

然后使用以下方式在地图中查找项目:

contactMap.get(someName);

执行查找比每次扫描列表更快:O(1)的每次查找都是HashMap,而列表的O(n)。但是,它使用更多内存。

顺便提一下,您的Contacts类看起来像是一个单独的联系人,因此它应该被命名为单数:Contact

此外,您的find方法当前被声明为实例方法:

public int findItem(String name) {

意味着您实际需要Contacts的实例来查找Contacts的另一个实例。相反,声明它static

public static int findItem(String name) {

然后你可以在没有实例的情况下调用它:

Contacts found = Contacts.find("name");

答案 2 :(得分:0)

你问的问题不在List#indexOf(Object)的合同中,所以不,你不应该试着让列表以这种方式工作。

相反,您可以编写自己的方法,以便相对轻松地完成您想要的任务。只需遍历您的列表,找到与指定名称匹配的联系人。

/**
 * Returns the List index of the Contact with the specified name. If no such
 * Contact is found, -1 will be returned.
 */
public int findItem(String name) {
    for (int i = 0; i < contactList.size(); i++) {
        Contact contact = contactList.get(i);
        if (null == contact) continue;
        if (java.lang.Objects.equals(name, contact.getName())) return i;
    }
    return -1;
}

答案 3 :(得分:0)

只是为了添加家伙,我已经能够这样做了:

public void searchItem(String name) {
    for(int i = 0; i < contactList.size(); i++) {
        if(name.equals(contactList.get(i).getName())) {
            System.out.println("Found " + name);
            break;
        }
        else {
            System.out.println("Could not find name!");
        }
    }
}

但是,如果我有更大的名单,这不是很低效吗?有没有更有效的方法呢?

答案 4 :(得分:0)

如果您有兴趣。更好的方法是覆盖对象中的equals()和hashcode()。并以正确的方式使用indexOf。

您的equals可以根据名称确定相等性,因此删除所有额外的和不必要的代码。