Ich habe ContactList, die Kontakte mit firstName und lastName enthält. Ich möchte die Suche nach Vorname oder Nachname ausführen.wie suche schneller von contactList für gegeben string
Ich habe bereits Code geschrieben, der gut funktioniert, aber ich möchte die Suche in Bezug auf Geschwindigkeit und Speicher verbessern.
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());
}
}
}
}
Bitte schlagen Sie vor, wie Sie die Leistung in obigem Code verbessern können.
Sie können auch Indizierung verwenden, um Ihre Suche schneller.Allerdings müssen Sie nicht kümmern, wenn Ihre Liste weniger als 10k Elemente seit die Suchzeit ist ziemlich klein –
Ich dachte, Indexierung hinzuzufügen, aber ich bin nicht sicher, in welchem Feld ich Indizes firstName oder lastName setzen muss? – ManojP
@Kilanny Wie Sie sehen können Benutzer nach lastName oder firstName suchen kann so brauche ich zwei Index Wenn ja, dann müssen wir die Liste zweimal durchlaufen. – ManojP