1

电话簿包含号码和姓名。如果有人帮助我选择最佳收藏,我将不胜感激,这将有助于我的表现

  1. 添加姓名和号码。
  2. 按号码搜索姓名
  3. 按名称删除名称和编号。

目前我正在使用 HashMap,但这里名称和数字都是关键,这不会很好。另一种选择是将名称和数字包装在一个对象中,然后将它们添加到列表中。然后迭代并添加到列表中。但是,如果您可以向我推荐一些其他最好的收藏,我会这样做。

注意: -名称和号码是字符串

4

3 回答 3

1

我会使用一个对象,因为如果您需要存储的不仅仅是名称和号码,那么使用它会进一步增加范围。您可以编写一些辅助函数来获取您需要的数据。

于 2012-12-12T15:35:58.877 回答
1

如果您需要同时通过姓名和电话号码进行查询,那么将所有姓名-号码对放入一个列表中确实是可能且非常简单的,但是搜索和删除都将具有线性复杂度。

如果您想要更好的时间复杂度(例如常数或至少对数),您可能需要使用双向映射。例如,番石榴就BiMap提供了这种行为。

如果您需要自己实现它(例如,如果它是一个家庭作业),我将创建一个由两个内部HashMaps 组成的类,一个用于入口的每个方向。这将为您提供名称和号码的恒定时间查找。当然,您必须确保两个地图始终保持同步。

public class PhoneBook {

    private Map<String, String> namesToNumbers = new HashMap<>();
    private Map<String, String> numbersToNames = new HashMap<>();

    public void insertEntry(String name, String phoneNumber) {
        namesToNumbers.put(name, phoneNumber);
        numbersToNames.put(phoneNumber, name);
    }

    public String getNameForPhoneNumber(String phoneNumber) {
        return numbersToNames.get(phoneNumber);
    }

    public String getPhoneNumberForName(String name) {
        return namesToNumbers.get(name);
    }

    public void removeEntryByPhoneNumber(String phoneNumber) {
        String name = numbersToNames.get(phoneNumber);
        namesToNumbers.remove(name);
        numbersToNames.remove(phoneNumber);
    }

    public void removeEntryByName(String name) {
        String phoneNumber = namesToNumbers.get(name);
        numbersToNames.remove(phoneNumber);
        namesToNumbers.remove(name);
    }
}
于 2012-12-12T15:46:55.623 回答
0

您仍然可以使用 HashMap K=Number V=Name,因为逻辑上搜索速度更重要,并且您可以使用迭代器按名称删除,例如

Iterator i = map.entrySet().iterator();
while(i.hasNext()) {
    Entry e = i.next();
    if (e.getValue().equals("user1898282") {
        i.remove();
    }
}
于 2012-12-12T15:43:07.470 回答