- ベストアンサー
相互的な検索のできるハッシュテーブル?
こんにちは。データ構造とアルゴリズムを学習しているJava入門者です。 「名前」と「電話番号」の二つのデータを格納するハッシュテーブルを実装したプログラムを考えています。名前をキーにして電話番号を呼び出すところまではいったのですが、 それと同時に電話番号と名前のどちらを入力しても、もう片方が検索できるようなプログラムを作れ、というのが今回の課題なのです。 基本的なハッシュテーブルの構造は学んでいるのですが、 どうしても「名前と番号、どちらのデータからも同じデータに辿り着く」ようなハッシュ関数が頭に浮かびません。 検索して色々調べてみたのですが、それらしい記事を見つけることが出来ませんでしたので、ここに投稿させていただきました。 どうぞよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
HashTableのentrySet()でkey:valueのペアのSetを取得して、valueでsortし、valueでbinarySearchしてvalueを特定し、目的valueに対応するkeyを得る方法もありますが、あまりスマートではありませんね。そこで… -------------------------------------------- public class BidHashTable{ HashTable<String,String> nameToPhone; HashTable<String,String> phoneToName; public BidHashTable(){ //2つのHashTableを作る } public void put(String name, String phone){ nameToPhone.put(name, phone); phoneToName.put(phone, name); } public String getPhone(String name){ return nameToPhone.get(name); } public String getName(String phone){ return phoneToName.get(phone); } ... ... }
その他の回答 (1)
- bgbg
- ベストアンサー率53% (94/175)
順番に考えましょう。 ハッシュ云々ではなく、「名前」と「電話番号」の二つのデータを格納するクラスから考えましょう。 public class MyData { String name; String phoneNo; } その次に、このクラスにある文字列を引数に与えると、名前か電話番号のどちらかに一致するとtrueを返すようなメソッドを実装します。 このクラスのインスタンスを配列として保存すれば、あとは検索文字列を与えられたら配列の要素全てに対して上で実装したメソッドを実行すれば良いです。
お礼
回答どうもありがとうございます。 bgbgさんのおっしゃった通り、nameとnumberを格納するクラスを作り、ハッシュテーブルを作成してみました。 nameをキーにしたハッシュテーブルと、numberをキーにしたハッシュテーブルをそれぞれ作り、データ挿入時には与えられたデータをinsert()メソッド内で2つのハッシュテーブルどちらにも格納するようにしました。 searchメソッドでは、入力の最初のcharacterがDigitだった場合はDigitをキーにしたハッシュテーブルを検索に用い、そうでない場合はnameをキーにしたハッシュテーブルをそれぞれ検索に使いました。 先日課題を提出しましたが「実際に企業が実装しているものに近いハッシュテーブルの実装方法だ」という評価を教授からいただきました。どうもありがとうございました!
お礼
素早い回答ありがとうございます! rancoさんのコードは、つまりハッシュテーブルを2つ作っておいて、 nameをキーに使う値と、phoneをキーに使う値をそれぞれ同時に格納するということですね。 ハッシュテーブル自体を2つ使う・・・1つのハッシュテーブルをいかにしてキーと値両方からアクセスできるか、そればかり考えていた私には思い付きませんでした。。やってみます!
補足
大切なことを書いておくのを忘れてました。 課題の制約として、HashTable、HashMapなどのハッシュ関係のクラスは使わずに、自分で実装しなければいけないのでした。すみません。