2016-07-27 5 views
1

Wie wäre die beste Datenstruktur zum Speichern von Telefonbuchkontakten, die jeweils aus Vorname, Nachname und Telefonnummer bestehen. Der Benutzer muss in der Lage sein, nach jedem der Felder zu suchen. Es gab ähnliche Fragen, aber keine der Antworten war klar genug.Datenstruktur zum Speichern von Telefonbuchdaten

+0

Ich würde sagen, um eine Hash-Tabelle zu verwenden, aber es ist wirklich, was Sie sich wohl fühlen. – Michael

+0

Sind alle Telefonnummern US oder wird es diese merkwürdig formatierten Nicht-US-Nummern geben? –

Antwort

2

Erstellen Sie einen POJO-Typ, der Vorname, Nachname und Telefonnummer speichert (könnte es bei Bedarf veränderbar).

class PhoneBookEntry { 
    public final String firstName; 
    public final String lastName; 
    public final String phoneNumber; 

    public Entry(String firstName, String lastName, String phoneNumber) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.phoneNumber = phoneNumber; 
    } 

    //... equals + hashcode implementation 
} 

Sie können Ihr Telefonbuch wie folgt erstellen:

class PhoneBook { 
    private Map<String, Set<PhoneBookEntry>> firstNameMap; 
    private Map<String, Set<PhoneBookEntry>> lastNameMap; 
    private Map<String, Set<PhoneBookEntry>> phoneNumberMap; 

    public void add(PhoneBookEntry entry) { 
     Set<PhoneBookEntry> set 
      = firstNameMap.computeIfAbsent(entry.firstName, k -> new HashSet<>()); 
     set.add(entry); 

     set = lastNameMap.computeIfAbsent(entry.lastName, k -> new HashSet<>()); 
     set.add(entry); 

     set = phoneNumberMap.computeIfAbsent(entry.phoneNumber, k -> new HashSet<>()); 
     set.add(entry); 
    } 

    public Set<PhoneBookEntry> getByFirstName(String firstName) { 
     return firstNameMap.get(firstName); 
    } 

    public Set<PhoneBookEntry> getByLastName(String lastName) { 
     return lastNameMap.get(lastName); 
    } 

    public Set<PhoneBookEntry> getByPhoneNumber(String phoneNumber) { 
     return phoneNumberMap.get(phoneNumber); 
    } 

} 

Mit Map s für schnelles Nachschlagen ermöglicht.

Wie bereits erwähnt, können mehrere Kontakte den gleichen Vornamen, Nachnamen oder die gleiche Telefonnummer haben. Eine Suche nach dem Vornamen (zum Beispiel) gibt eine Reihe von Kontakten zurück.

1

Erstellen Sie ein Kontaktobjekt, in dem die Variablen gespeichert sind, die für jeden Kontakt benötigt werden. Verwenden Sie eine ArrayList, um sie zu speichern.

Ohne weitere Informationen über den Kontakt gibt es nicht wirklich eine Möglichkeit, eine HashTable, Map oder Graph zu verwenden. Es gibt kein echtes Schlüsselwertpaar für eine HashTable, es sei denn, Sie möchten eine Kombination aus Vor- und Nachnamen verwenden, aber Sie benötigen eine Möglichkeit zur Behandlung von Konflikten (wenn 2 Personen denselben Namen haben), oder Sie müssen dies verbieten Haben Sie 2 Personen mit dem gleichen Kontaktnamen (aber warum sollten Sie das tun wollen?)

+0

Wenn ich jedem Kontakt eine eindeutige ID als Schlüssel zuweisen möchte, wie kann ich dann die restlichen Daten speichern? Was wäre der Wert? – Mitaryss

+0

Sie würden eine HashMap/HashTable/TreeMap verwenden, wobei der Schlüssel der Int oder String oder ein anderer Datentyp ist, der die eindeutige ID bildet und der Wert das Kontaktobjekt ist. Dies würde jedoch bedeuten, dass Sie die eindeutige ID kennen müssen, um das Objekt von der Karte abzurufen. – yitzih

0
Class Contact{ 

String forename; 
String Surname; 
String phoneNo; 

public Contact(fName, sName, pNo){ 
forename = fName; 
Surname = sName; 
phoneNo = pNo; 
} 

public String getForename(){} 

public String getSurname(){} 

public String getPhoneNo(){} 

}

in der Klasse der Suche Handhabung Sie eine Arraylist vom Typ Kontakt zu erklären, und wenn Sie nach einem Kontakt suchen sagen John,

public Contact searchContact(String s){ 
for(int i = 0; i< ContactList.size(); i++){ 
if(ContactList.get(i).getForename().equals(s) || 
       ContactList.get(i).getSurame().equals(s) || 
      ContactList.get(i).getPhoneNo().equals(s) 
){ 
return ContactList.get(i); 
} 
} 

return null; 
} 
0

Art einer vage Frage, aber was solls, vielleicht wird das meine Post-Lunch-Schläfer verjagen. Ich nehme eine einfache String-Darstellung der Telefonnummer an, aber das beste Datenobjekt, um alle möglichen Arten von Welttelefonnummern zusammen mit einer Methode zu speichern, um sie intelligent zu suchen (zB ist "(123) 456-7891" dasselbe wie) "1234567891"?) Könnte es ganz eigene Frage sein.

Hier speichert eine PhoneBook-Klasse alle Kontakte. Die Methoden searchFirst(), searchLast() und searchPhoneNumber() geben jeweils Listen passender Kontakte zurück.

public class PhoneBook { 

    ArrayList<Contact> contacts; 

    public PhoneBook() { 
     contacts = new ArrayList<>(); 
    } 

    public void addContact(Contact contact) { 
     contacts.add(contact); 
    } 

    public ArrayList<Contact> searchFirst(String first) { 
     ArrayList<Contact> foundContacts = new ArrayList<>(); 
     for (Contact contact: contacts) { 
      if (contact.first.equals(first)) { 
       foundContacts.add(contact); 
      } 
     } 
     return foundContacts; 
    } 

    public ArrayList<Contact> searchLast(String last) { 
     ArrayList<Contact> foundContacts = new ArrayList<>(); 
     for (Contact contact: contacts) { 
      if (contact.last.equals(last)) { 
       foundContacts.add(contact); 
      } 
     } 
     return foundContacts; 
    } 

    public ArrayList<Contact> searchPhoneNumber(String phoneNumber) { 
     ArrayList<Contact> foundContacts = new ArrayList<>(); 
     for (Contact contact: contacts) { 
      if (contact.phoneNumber.equals(phoneNumber)) { 
       foundContacts.add(contact); 
      } 
     } 
     return foundContacts; 
    } 

    class Contact { 
     String first; 
     String last; 
     String phoneNumber; 

     public Contact(String first, String last, String phoneNumber) { 
      this.first = first; 
      this.last = last; 
      this.phoneNumber = phoneNumber; 
     } 
    } 

}