- PR -

双方向検索できる仕組みはありますか

投稿者投稿内容
isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 2002-05-24 15:56
こんにちは
いつもお世話になっております。
Hashtableだと
Hashtable#put(a,b)をすれば
あくまでも
Hashtable#get(a)でbを取得することになって
Hashtable#get(b)でaを取得することは決してできないので
双方とも出来るようなclassもあるのでしょうか。

よろしくお願いします。
まりり
ぬし
会議室デビュー日: 2001/12/05
投稿数: 329
投稿日時: 2002-05-24 16:23
何をしたくてそういうことを考えているのかが見えないのですが、
標準のAPIでは見たことはないですし、そういう機能をもったclassを含む
ライブラリも不勉強にして知りません。

単純に考えたら、

 Hashtable hash = new Hashtable();
 hash.put(a,b);
 hash.put(b,a);

で事足りそうですが。
isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 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を取得できるような実装(仕様)になっても
宜しいではないかと、、
hatena
会議室デビュー日: 2002/02/14
投稿数: 14
投稿日時: 2002-05-24 21:14
データの重複よりも先に、検索アルゴリズムのハッシュ法を理解するのが先だと思います。

しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-05-24 21:37
はぁ。

hashtable.put(a, b);
hashtable.put(c, b);

ができないとでも?

このとき hastable.get(b); はどうなるんでしょう。
へげもん
ベテラン
会議室デビュー日: 2002/04/14
投稿数: 87
お住まい・勤務地: 埼玉県
投稿日時: 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のサイズがごく小さい場合は効率が悪いかも知れません。
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-05-25 01:07
>>このとき hastable.get(b); はどうなるんでしょう。
> bをキーにしてput()していなければ、nullが返りますね。

あぁ、いや、そゆことじゃなくて

>KEY objectとVALUE objectも一対一でまったく対称的ですから、

が違うでしょ、実験してみましょ。
ってことです。

Vector getKeysforValue(String value)

は、まぁ、あっても悪くはないでしょうけど…
あんま使いでがあるような気はしないな…
へげもん
ベテラン
会議室デビュー日: 2002/04/14
投稿数: 87
お住まい・勤務地: 埼玉県
投稿日時: 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);

しかないでしょうね。

スキルアップ/キャリアアップ(JOB@IT)