用于存储电话簿数据的数据结构

时间:2016-07-27 17:13:49

标签: java data-structures

存储电话簿联系人的最佳数据结构是什么,每个联系人包括名字,姓氏和电话号码。用户必须能够按每个字段进行搜索。 有类似的问题,但没有一个答案是清楚的。

4 个答案:

答案 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 s可以快速查找。

正如yitzih所说,多个联系人可以使用相同的名字,姓氏或电话号码。因此,按名字(例如)查找将返回一组联系人。

答案 1 :(得分:1)

创建一个Contact对象,用于存储每个联系人所需的变量。使用ArrayList存储它们。

如果没有关于联系人的更多信息,实际上没有任何方法可以使用HashTable,Map或Graph。除非你想使用名字和姓氏的组合,否则HashTable没有真正的键值对,但你需要一些方法来处理冲突(如果2个人有完全相同的名字。),或者你需要禁止有两个人有相同的联系人姓名(但你为什么要这样做?)

答案 2 :(得分: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(){}

}

在处理搜索的类中, 你声明一个类型为Contact的arrayList,当搜索联系人时说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;
}

答案 3 :(得分:0)

有点模糊的问题,但到底是什么,也许这会把我的午餐后的睡眠赶走。我假设电话号码的简单字符串表示,但是存储所有可能的世界电话号码的最佳数据对象以及智能搜索它们的方法(例如&#34;(123)456- 7891&#34;与&#34; 1234567891&#34;?相同可能完全是它自己的问题。

这里的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;
        }
    }

}