我应该在这里使用哪个系列?

时间:2012-12-12 15:30:58

标签: java collections

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

  1. 添加姓名和号码。
  2. 按编号搜索姓名
  3. 按名称删除姓名和号码。
  4. 目前我正在使用HashMap,但这里名称和数字都是关键,这不会很好。另一种选择是将名称和数字包装在一个对象中,然后将它们添加到列表中。然后迭代并添加到列表中。但是,如果你可以向我推荐一些最好的收藏品,我会这样做。

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

3 个答案:

答案 0 :(得分:1)

我会使用一个对象,因为如果您需要存储的不仅仅是名称和数字,那么它会在行下方添加更多范围。您可以编写一些辅助函数来获取所需的数据。

答案 1 :(得分:1)

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

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

如果您需要自己实现(例如,如果它是作业),我将创建一个由两个内部HashMap组成的类,每个方向对应一个方向。这将为您提供常量查找名称和号码。当然,您必须确保始终保持两个地图同步。

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

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