电话簿包含号码和姓名。如果有人帮助我选择最佳收藏,我将不胜感激,这将有助于我的表现
- 添加姓名和号码。
- 按号码搜索姓名
- 按名称删除名称和编号。
目前我正在使用 HashMap,但这里名称和数字都是关键,这不会很好。另一种选择是将名称和数字包装在一个对象中,然后将它们添加到列表中。然后迭代并添加到列表中。但是,如果您可以向我推荐一些其他最好的收藏,我会这样做。
注意: -名称和号码是字符串
电话簿包含号码和姓名。如果有人帮助我选择最佳收藏,我将不胜感激,这将有助于我的表现
目前我正在使用 HashMap,但这里名称和数字都是关键,这不会很好。另一种选择是将名称和数字包装在一个对象中,然后将它们添加到列表中。然后迭代并添加到列表中。但是,如果您可以向我推荐一些其他最好的收藏,我会这样做。
注意: -名称和号码是字符串
我会使用一个对象,因为如果您需要存储的不仅仅是名称和号码,那么使用它会进一步增加范围。您可以编写一些辅助函数来获取您需要的数据。
如果您需要同时通过姓名和电话号码进行查询,那么将所有姓名-号码对放入一个列表中确实是可能且非常简单的,但是搜索和删除都将具有线性复杂度。
如果您想要更好的时间复杂度(例如常数或至少对数),您可能需要使用双向映射。例如,番石榴就BiMap
提供了这种行为。
如果您需要自己实现它(例如,如果它是一个家庭作业),我将创建一个由两个内部HashMap
s 组成的类,一个用于入口的每个方向。这将为您提供名称和号码的恒定时间查找。当然,您必须确保两个地图始终保持同步。
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);
}
}
您仍然可以使用 HashMap K=Number V=Name,因为逻辑上搜索速度更重要,并且您可以使用迭代器按名称删除,例如
Iterator i = map.entrySet().iterator();
while(i.hasNext()) {
Entry e = i.next();
if (e.getValue().equals("user1898282") {
i.remove();
}
}