- - PR -
双方向検索できる仕組みはありますか
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2002-05-24 15:56
こんにちは
いつもお世話になっております。 Hashtableだと Hashtable#put(a,b)をすれば あくまでも Hashtable#get(a)でbを取得することになって Hashtable#get(b)でaを取得することは決してできないので 双方とも出来るようなclassもあるのでしょうか。 よろしくお願いします。 |
|
投稿日時: 2002-05-24 16:23
何をしたくてそういうことを考えているのかが見えないのですが、
標準のAPIでは見たことはないですし、そういう機能をもったclassを含む ライブラリも不勉強にして知りません。 単純に考えたら、 Hashtable hash = new Hashtable(); hash.put(a,b); hash.put(b,a); で事足りそうですが。 |
|
投稿日時: 2002-05-24 17:05
まりりさん
ご返答ありがとうございます。 まりりさん: >Hashtable hash = new Hashtable(); >hash.put(a,b); >hash.put(b,a); =================== ↑考えたことありますけれども データの重複となりますね。 特にデータの数が多い場合、、 ****************************************************** 言い間違ったら御免なさい、 思うのはHashtableのようなものはすごく便利ですが、 KEY objectとVALUE objectも一対一でまったく対称的ですから、 VALUE objectからKEY objectを取得できるような実装(仕様)になっても 宜しいではないかと、、 |
|
投稿日時: 2002-05-24 21:14
データの重複よりも先に、検索アルゴリズムのハッシュ法を理解するのが先だと思います。
|
|
投稿日時: 2002-05-24 21:37
はぁ。
hashtable.put(a, b); hashtable.put(c, b); ができないとでも? このとき hastable.get(b); はどうなるんでしょう。 |
|
投稿日時: 2002-05-24 23:47
個人的には、Hashtableは同期を取るため重いので、HashMapが好
みです。 しょむさん: >hashtable.put(a, b); >hashtable.put(c, b); > >このとき hastable.get(b); はどうなるんでしょう。 bをキーにしてput()していなければ、nullが返りますね。 issekiさん: >>hash.put(a,b); >>hash.put(b,a); >=================== >↑考えたことありますけれども >データの重複となりますね。 キーのオブジェクトをclone()して保存するHashtableの実装もあ るかもしれませんが、通常は参照で持っていることが多いですね。 なので、ほとんどの場合は重複にはならないと思います。 ただ、Hashtableのバケットは二倍の量が必要ですから、上記のa やbのサイズがごく小さい場合は効率が悪いかも知れません。 |
|
投稿日時: 2002-05-25 01:07
>>このとき hastable.get(b); はどうなるんでしょう。
> bをキーにしてput()していなければ、nullが返りますね。 あぁ、いや、そゆことじゃなくて >KEY objectとVALUE objectも一対一でまったく対称的ですから、 が違うでしょ、実験してみましょ。 ってことです。 Vector getKeysforValue(String value) は、まぁ、あっても悪くはないでしょうけど… あんま使いでがあるような気はしないな… |
|
投稿日時: 2002-05-25 09:22
しょむさん:
> >KEY objectとVALUE objectも一対一でまったく対称的ですから、 > > が違うでしょ、実験してみましょ。 > ってことです。 うーむ。同じオブジェクトを違うキーで登録してみよう、です か? それなら、 hash.put(a,b); hash.put(c,b); x = hash.get(a); y = hash.get(c); なのでは? > Vector getKeysforValue(String value) HashMapには全部のエントリを取得するメソッドならありますが。 Set entrySet() そこから、Map.Entryを一個ずつ取り出してgetValue()し、 valueが等しいkeyを探すことになりますね。O(n)なんで重いですけ ど。 O(1)やO(log n)でやりたければ、やっぱり hash.put(a,b); hash.put(b,a); しかないでしょうね。 |
