电话簿包含号码和姓名。我将不胜感激,如果有人帮我选择最佳收藏品,这将有助于我执行
目前我正在使用HashMap,但这里名称和数字都是关键,这不会很好。另一种选择是将名称和数字包装在一个对象中,然后将它们添加到列表中。然后迭代并添加到列表中。但是,如果你可以向我推荐一些最好的收藏品,我会这样做。
注意: - 名称和号码是字符串
答案 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();
}
}