- PR -

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

投稿者投稿内容
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-05-25 15:24
えと…そうじゃなくて…

isseki:
> Hashtable#put(a,b)をすれば
> あくまでも
> Hashtable#get(a)でbを取得することになって
> Hashtable#get(b)でaを取得することは決してできないので



iseeki:
> KEY objectとVALUE objectも一対一でまったく対称的ですから、
> VALUE objectからKEY objectを取得できるような実装(仕様)になっても

から、hatena さんがおっしゃっているように、isseki さんが「key と value が一対一」なんていう大きな誤解をしたはるんではないかなと。

なので、「put(a,b); put(c,b);」ができるんだから一対一じゃないことは確かめられるでしょ、ということです。

目的が「value から key を引きたい」なら、keys から探すしかないです。
set(key, value) { hash.put(key,value); hash.put(value, key); } しても、
set(a, b); set(c, b); すると

k v
a -> b
b -> a
c -> b
b -> c

で get(b) が後優先になったりして、同様のことが set(a,b); set(b,c); でも起こったりして…。わけわからんす。ちゃんと key と value が一対一になってるかを確認しないといけませんから、汎用クラスとして意味があるかは…。
へげもん
ベテラン
会議室デビュー日: 2002/04/14
投稿数: 87
お住まい・勤務地: 埼玉県
投稿日時: 2002-05-25 17:41
しょむさん:
> hatena さんがおっしゃっているように、isseki さんが「key と value
> が一対一」なんていう大きな誤解をしたはるんではないかなと。

 なるほど、それでしたか。

> なので、「put(a,b); put(c,b);」ができるんだから一対一じゃないことは確
> かめられるでしょ、ということです。

 ここで、

> このとき hastable.get(b); はどうなるんでしょう。

これが突然出てきて面食らったんですが、このときのset()は

> set(key, value) { hash.put(key,value); hash.put(value, key); }

という実装を想定していたわけですね。これは読みきれませんでした。

> で get(b) が後優先になったりして、同様のことが set(a,b); set(b,c); で
> も起こったりして…。わけわからんす。ちゃんと key と value が一対一にな
> ってるかを確認しないといけませんから、汎用クラスとして意味があるかは…。

 確かに、Hashtableは同一キーに対する値の重複を許しませんから、put()の
戻り値を確認してやるしかないですね。
 個人的には、「valueとして値のListを渡す」などの回避策を示すことも
しばしばです。
isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 2002-05-27 13:03
みなさん
こんにちは

いろいろご意見本当にいい勉強になりました。

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

書いた後、馬鹿だなと自分も気づいたが、すぐ訂正できませんでした。m(__;);m

ありがとう御座いました。

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