【发布时间】:2016-06-26 09:05:11
【问题描述】:
我有 ContactList,其中包含名字和姓氏的联系人。我想按名字或姓氏进行搜索。
我已经编写了运行良好的代码,但我想在速度和内存方面改进搜索。
public class Contact implements Comparable<Contact> {
private String firstName;
private String lastName;
private String name;
public Contact(String name) {
this.name = name;
if (name.contains(" ")) {
this.firstName = name.split("\\s+")[0];
this.lastName = name.split("\\s+")[1];
} else {
this.firstName = name;
this.lastName = "";
}
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Contact{" + name + '}';
}
@Override
public int compareTo(Contact contact) {
System.out.println("in compareto");
return this.name.compareToIgnoreCase(contact.getName());
}
@Override
public int hashCode() {
return (firstName.hashCode() * (lastName != null ? lastName.hashCode() : 0));
}
@Override
public boolean equals(Object obj) {
if(obj == null)
return false;
if(!(obj instanceof Contact))
return false;
Contact other = (Contact) obj;
if(! this.name.equalsIgnoreCase(other.name)) return false;
return true;
}
}
public class ContactService {
private Set<Contact> contacts;
public ContactService() {
this.contacts = new TreeSet<>();
}
public void addContact(String name) {
Contact contact = new Contact(name);
contacts.add(contact);
}
public void searchContact(String searchStr) {
System.out.println(contacts);
for (Contact contact : contacts) {
if (contact.getName().equalsIgnoreCase(searchStr)||(searchStr.contains(" ") && contact.getName().contains(searchStr))) {
System.out.println(contact.getName());
} else if (contact.getFirstName().toLowerCase().startsWith(searchStr) || contact.getLastName().toLowerCase().startsWith(searchStr)) {
System.out.println(contact.getName());
}
}
}
}
请建议如何提高上述代码的性能。
【问题讨论】:
-
您还可以使用索引来加快搜索速度。但是,您不必关心您的列表是否少于 10k 个元素,因为搜索时间非常短。
-
我正在考虑添加索引,但我不确定我需要在哪个字段上放置索引 firstName 或 lastName?
-
@Kilanny 如您所见,用户可以按姓氏或名字搜索,所以我需要有两个索引,如果是,那么我们需要遍历列表两次。
-
没有。您需要对 combined 名字和姓氏有索引。你也可以使用这个库lucene.apache.org/core
-
我使用的是纯java代码,所以需要自己编写代码。
标签: java sorting search collections