1

電話帳には番号と名前が含まれています。誰かが私が実行するのに役立つ最高のコレクションを選択するのを手伝ってくれたら、私は感謝します

  1. 名前と番号を追加します。
  2. 番号で名前を検索
  3. 名前と番号を名前で削除します。

現在、私は HashMap を使用していますが、ここでは名前と番号の両方がキーになるため、うまくいきません。もう 1 つのオプションは、名前と番号の両方をオブジェクトにラップしてからリストに追加することです。次に、反復してリストに追加します。しかし、最高のコレクションになり得る別のコレクションを提案していただければ、それを行います。

注: -名前と番号は文字列です

4

3 に答える 3

1

名前と番号以上のものを保存する必要がある場合、オブジェクトを使用すると、さらにスコープが追加されるため、オブジェクトを使用します。いくつかのヘルパー関数を記述して、必要なデータを取得できます。

于 2012-12-12T15:35:58.877 に答える
1

名前と電話番号の両方でクエリを実行する必要がある場合、すべての名前と番号のペアをリストに入れることは実際に可能であり、非常に簡単ですが、検索と削除の両方が直線的に複雑になります。

より良い時間の複雑さ (たとえば、定数または少なくとも対数) が必要な場合は、双方向マップを使用することをお勧めします。たとえば、グアバ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);
    }
}
于 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 に答える