- - PR -
Beanの比較について
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-04-11 16:11
Beanの比較について教えて下さい。
やりたい事は複数のフィールドを持つ下記のようなBeanクラスを1つのデータとして扱い、 1.Bean同士を比較しソートを行う 2.Beanの配列から重複したデータを除く です。
ソートに関してはComparatorインターフェースのcompareメソッドを実装する事により 実現できると思います。 重複データを除く事に関しては、配列をループで1件ずつ比較するという方法で行えば 実現はできるのですが、データ件数が多い場合はパフォーマンスが悪そうなので 別の方法がないか調べています。
何か良い方法があれば、ご教授下さい。 それと、初歩的な質問かもしれませんが、Comparatorインターフェースのcompareメソッドを 実装するのとComparableインターフェースのcompareToメソッドを実装するのでは 何が異なるのでしょうか? よろしくお願い致します。 [ メッセージ編集済み 編集者: OZ 編集日時 2006-04-11 16:40 ] | ||||||||||||
|
投稿日時: 2006-04-11 16:21
重複を許さない Set にインスタンスを積み込んでいくのはいかがでしょう?
| ||||||||||||
|
投稿日時: 2006-04-11 16:26
インギさん、ありがとうございます。
は、例えばHashSetに要素として追加していくという事でしょうか? それは試してみたのですが、フィールドの値が全て同じでも異なる要素として追加できて(重複)しまいました。 単純にAddするという事ではないのでしょうか? | ||||||||||||
|
投稿日時: 2006-04-11 16:45
値は同じでもオブジェクトとして別の物(メモリアドレスが違う)だからだと思います。
TreeSetにComparatorを与えてインスタンス化したセットに、Comparableを実装したBeanを追加すれば出来ると思います。 # 訂正です、すみません。 # Comparatorに任せるなら追加するオブジェクトはComparableを実装する必要はありません。 # Comparatorを使わないなら追加するオブジェクトはComparableを実装する必要があります。 [ メッセージ編集済み 編集者: 想馬 編集日時 2006-04-11 16:58 ] | ||||||||||||
|
投稿日時: 2006-04-11 16:46
Comparator も Comparable も、おおまかな機能は同じです。 僭越な意見ですがアーキテクチャーが悪いのだと思います。私は Comparator だけあれば良いと思います。Comparable は要らないと思います。 ちなみに、後述の equals メソッドも Object クラスに備えるのではなく、Equalator インターフェースのようなものがあったほうが良かったと思います。
Set において、要素が重複かどうかを判断するためには、equals メソッドを作る必要があります。equals メソッドを作って Set に add してみて、デバッガーなどで equals メソッドが呼ばれることを確認されると良いでしょう。 概念的には compare を作るとの同じ感じです。 | ||||||||||||
|
投稿日時: 2006-04-11 17:12
想馬さん、ありがとうございます。
できました!インギさんもこの事を仰ってたのですね。 unibonさん、ありがとうございます。
そういう事ですか。 自分でも調べてみたのですが、大抵2つ並べて「どちらかが実装されている事」 というような書き方をしてあるので違いが良く分かりませんでした。
equalsメソッドも実装したのですが、HashSetでは同じ結果となりました。 今回はTreeSetで実現できたので、これで行おうかと思います。 | ||||||||||||
|
投稿日時: 2006-04-11 17:15
equals()をオーバーライドするなら、hashCode()もオーバーライドしましょう。
(by 「Effective Java」項目8 ) とくにHash〜なコレクションを使うときには、これを忘れるとひどい目に遭います。 [ メッセージ編集済み 編集者: びしばし 編集日時 2006-04-11 17:19 ] | ||||||||||||
|
投稿日時: 2006-04-11 20:25
Effective Java (原書) の、hashCode/equals/Comparableの部分が
Sunから公開されてますので、参考になるかも。 http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf (PDF) - Item 8: Always override hashCode when you override equals - Item 11: Consider implementing Comparable 実装が正しいかどうか比較するなら、Jakarta Commons Langのlang.builder も参考にになるかと。 Users guide for Jakarta Commons "Lang" Package org.apache.commons.lang.builder |