我希望能够使用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);
}
答案 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可以根据名称确定相等性,因此删除所有额外的和不必要的代码。