- - PR -
HashMapのキー情報を後から参照するには?
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-09-01 02:21
JDK5でDBテーブルのレコードを表現する以下のようなクラスがあります。
このSamplePojoをキーとして別の値を持たせるHashMapを使う場合、equalsとhashCodeのオーバーライドにより実際にはid情報のみがキーとなるため、以下のようにmapに色々データを格納した後の処理ではidのみをセットしたSamplePojoとcontainsKeyメソッドでキーの存在チェックをすることができますが、実際にそのキーとして使われたSamplePojoのfield値の方を参照したい場合にはどうすればよいでしょうか? entrySetやkeySetのループで再検索するのは非効率だと思うので、HashMapの値の方にもキーと同じSamplePojoを格納しておくようにするしかないでしょうか?
| ||||||||
|
投稿日時: 2008-09-01 06:59
(私は POJO などは良く知らないのですが、それ以外のことについて書きます。)
まず、Map の Key として使うクラスは、equals で同一性を検査するものであるため、後からそのインスタンスを気にするような設計は、キレイではないと思います。設計段階ではじくべきだろうと思います。 すでにそういう設計にしているので、そのまま進みたいということで考えますと、Map に getKey というメソッドがあればそれで解決できることなのでしょうが、現実にはそういうメソッドはないし、HashMap のクラスを extends などして改造するのも、アクセス修飾子の問題があるので面倒かもしれません。どこかのクラスライブラリーには getKey 相当のものが付いているものもあるかもしれませんが。
Value のほうに入れる分には問題ないと思います。これが良いと思います。 ただし、Key と Value に同じもの(クラス)を入れるというのも冗長性があって、ちょっと気にはなります。 | ||||||||
|
投稿日時: 2008-09-01 11:44
equals メソッドと hashCode メソッドをオーバーライドして、同一性がゆるやかにしているから、横着したくなるのかもしれないけど…。
SamplePojo("Pojo1") から SamplePojo("Pojo1", Integer.valueOf(0)) を探したいというのは、"Pojo1" から SamplePojo("Pojo1", Integer.valueOf(0)) を探したいということに他ならない。 ならば、HashMap<String, SamplePojo> を新たに作成し、String id から SamplePojo key を検索できるようにするのが正道ではないかな。 | ||||||||
|
投稿日時: 2008-09-01 14:08
ご回答ありがとうございます。
unibon様がおっしゃるようにgetKeyのようなものがないかと思っており、KeyとValueの両方に同じものを入れるのも少し無駄な気がしていました。 HibernateのMiddlegenツールでコード生成するとSamplePojoのようなクラスができたので、HashMapに格納することによりメモリ上でも簡易DB的な使い方ができるかと思ったのですが、やはりidからkeyインスタンス全体を参照できるようにValueにも入れるか、別のHashMapを用意するのが自然、ということでデータ構造と処理を考え直してみることにします。 ありがとうございました。 |
1