名前と電話番号の両方でクエリを実行する必要がある場合、すべての名前と番号のペアをリストに入れることは実際に可能であり、非常に簡単ですが、検索と削除の両方が直線的に複雑になります。
より良い時間の複雑さ (たとえば、定数または少なくとも対数) が必要な場合は、双方向マップを使用することをお勧めします。たとえば、グアバBiMap
はまさにこの動作を提供します。
これを自分で実装する必要がある場合 (たとえば、宿題の場合)、HashMap
エントリの各方向に 1 つずつ、2 つの inner で構成されるクラスを作成します。これにより、名前と番号の両方を一定時間検索できます。もちろん、両方のマップを常に同期させておく必要があります。
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);
}
}