2016-07-27 2 views
1

Какая будет лучшая структура данных для хранения контактов телефонной книги, каждая из которых состоит из имени, фамилии и номера телефона. Пользователь должен иметь возможность выполнять поиск по каждому из полей. Были похожие вопросы, но ни один из ответов не был достаточно ясным.Структура данных для хранения данных телефонной книги

+0

Я бы сказал, чтобы использовать хеш-таблицу, но это действительно то, с чем вам удобно. – Michael

+0

Будут ли все номера телефонов в США или будут ли эти странные форматированные номера без США? –

ответ

2

Создайте тип POJO, в котором хранятся имя, фамилия и номер телефона (при необходимости можно изменить его).

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 
} 

Вы можете создать телефонную книгу так:

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); 
    } 

} 

Использование Map сек позволяет быстрого поиска.

Как сказал yitzih, несколько контактов могут иметь одно и то же имя, фамилию или номер телефона. Таким образом, поиск по имени (например), вернет набор контактов.

1

Создайте контактный объект, который хранит переменные, необходимые для каждого контакта. Используйте ArrayList для их хранения.

Без дополнительной информации о контакте на самом деле нет способа использовать HashTable, карту или график. Нет пары реальных значений для HashTable, если вы не хотите использовать комбинацию имени и фамилии, но вам нужно будет каким-то образом справиться с конфликтами (если у 2 человек есть то же самое имя.), Или вам нужно будет запретить имея 2 человека, имеющих одинаковое имя контакта (но зачем вы хотите это сделать?)

+0

Если я назначаю уникальный идентификатор каждому контакту для использования в качестве ключа, как я могу хранить остальные данные? Какова была бы ценность? – Mitaryss

+0

Вы должны использовать HashMap/HashTable/TreeMap с ключом, который является int или String или любым типом данных, который составляет уникальный идентификатор, а значение - объект Contact. Однако это означает, что вам нужно знать уникальный идентификатор для извлечения объекта с карты. – 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(){} 

}

в обработке поиска класса, вы объявляете ArrayList типа Contact, и при поиске контакта сказать, Джон,

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

Вид смутного вопрос, но что, черт возьми, может быть, это преследует мои послеобеденные сонли. Я предполагаю простое строковое представление номера телефона, но лучший объект данных для хранения всех возможных разновидностей телефонных номеров мира, а также метод интеллектуального поиска их (например, «(123) 456-7891», то же самое, что и «1234567891»?) Может быть его собственным вопросом.

Здесь класс PhoneBook хранит все контакты. Методы searchFirst(), searchLast() и searchPhoneNumber() возвращают списки соответствующих контактов.

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; 
     } 
    } 

} 
Смежные вопросы