- PR -

Beanの比較について

投稿者投稿内容
OZ
常連さん
会議室デビュー日: 2006/02/27
投稿数: 45
投稿日時: 2006-04-11 16:11
Beanの比較について教えて下さい。

やりたい事は複数のフィールドを持つ下記のようなBeanクラスを1つのデータとして扱い、
1.Bean同士を比較しソートを行う
2.Beanの配列から重複したデータを除く
です。

コード:

1 : public Class BeanSamp() implements Comparator{
2 : private int height = 0;
3 : private int weight = 0;
4 : private String blood;
5 :
6 : public setHeight(int i){
7 : height = i;
8 : }
9 :
10: public setWeight(int i){
11: weight = i;
12: }
13:
14: public setBlood(String s){
15: blood = s;
16: }
17:
18: public void getHeight(){
19: return height;
20: }
21:
22: public void getWeight(){
23: return weight;
24: }
25:
26: public void getBlood(){
27: return blood;
28: }
29:
30: public int compare(Object o1,Object o2){
31: //フィールドを比較してintをリターンする処理
32: }
33: }



ソートに関してはComparatorインターフェースのcompareメソッドを実装する事により
実現できると思います。

重複データを除く事に関しては、配列をループで1件ずつ比較するという方法で行えば
実現はできるのですが、データ件数が多い場合はパフォーマンスが悪そうなので
別の方法がないか調べています。

コード:

1 :  BeanSamp[] dataSet1;
2 : BeanSamp[] dataSet2;
3 :
4 : //1.データを取得してdataSet1を作成
5 : //2.データを取得してdataSet2を作成
6 : //3.dataSet1とdataSet2をマージする
7 : //  このとき重複しているデータは除外する
8 : //・・・



何か良い方法があれば、ご教授下さい。

それと、初歩的な質問かもしれませんが、Comparatorインターフェースのcompareメソッドを
実装するのとComparableインターフェースのcompareToメソッドを実装するのでは
何が異なるのでしょうか?

よろしくお願い致します。


[ メッセージ編集済み 編集者: OZ 編集日時 2006-04-11 16:40 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-04-11 16:21
重複を許さない Set にインスタンスを積み込んでいくのはいかがでしょう?
OZ
常連さん
会議室デビュー日: 2006/02/27
投稿数: 45
投稿日時: 2006-04-11 16:26
インギさん、ありがとうございます。

引用:

インギさんの書き込み (2006-04-11 16:21) より:
重複を許さない Set にインスタンスを積み込んでいくのはいかがでしょう?


は、例えばHashSetに要素として追加していくという事でしょうか?

それは試してみたのですが、フィールドの値が全て同じでも異なる要素として追加できて(重複)しまいました。
単純にAddするという事ではないのでしょうか?
想馬
大ベテラン
会議室デビュー日: 2003/05/29
投稿数: 245
お住まい・勤務地: 神奈川・東京
投稿日時: 2006-04-11 16:45
値は同じでもオブジェクトとして別の物(メモリアドレスが違う)だからだと思います。

TreeSetにComparatorを与えてインスタンス化したセットに、Comparableを実装したBeanを追加すれば出来ると思います。

# 訂正です、すみません。
# Comparatorに任せるなら追加するオブジェクトはComparableを実装する必要はありません。
# Comparatorを使わないなら追加するオブジェクトはComparableを実装する必要があります。

[ メッセージ編集済み 編集者: 想馬 編集日時 2006-04-11 16:58 ]
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-04-11 16:46
引用:

OZさんの書き込み (2006-04-11 16:11) より:
それと、初歩的な質問かもしれませんが、Comparatorインターフェースのcompareメソッドを
実装するのとComparableインターフェースのcompareToメソッドを実装するのでは
何が異なるのでしょうか?


Comparator も Comparable も、おおまかな機能は同じです。
僭越な意見ですがアーキテクチャーが悪いのだと思います。私は Comparator だけあれば良いと思います。Comparable は要らないと思います。
ちなみに、後述の equals メソッドも Object クラスに備えるのではなく、Equalator インターフェースのようなものがあったほうが良かったと思います。

引用:

OZさんの書き込み (2006-04-11 16:26) より:
それは試してみたのですが、フィールドの値が全て同じでも異なる要素として追加できて(重複)しまいました。
単純にAddするという事ではないのでしょうか?


Set において、要素が重複かどうかを判断するためには、equals メソッドを作る必要があります。equals メソッドを作って Set に add してみて、デバッガーなどで equals メソッドが呼ばれることを確認されると良いでしょう。
概念的には compare を作るとの同じ感じです。
OZ
常連さん
会議室デビュー日: 2006/02/27
投稿数: 45
投稿日時: 2006-04-11 17:12
想馬さん、ありがとうございます。
引用:

想馬さんの書き込み (2006-04-11 16:45) より:
値は同じでもオブジェクトとして別の物(メモリアドレスが違う)だからだと思います。

TreeSetにComparatorを与えてインスタンス化したセットに、Comparableを実装したBeanを追加すれば出来ると思います。

# 訂正です、すみません。
# Comparatorに任せるなら追加するオブジェクトはComparableを実装する必要はありません。
# Comparatorを使わないなら追加するオブジェクトはComparableを実装する必要があります。



できました!インギさんもこの事を仰ってたのですね。

unibonさん、ありがとうございます。
引用:

Comparator も Comparable も、おおまかな機能は同じです。
僭越な意見ですがアーキテクチャーが悪いのだと思います。私は Comparator だけあれば良いと思います。Comparable は要らないと思います。
ちなみに、後述の equals メソッドも Object クラスに備えるのではなく、Equalator インターフェースのようなものがあったほうが良かったと思います。



そういう事ですか。
自分でも調べてみたのですが、大抵2つ並べて「どちらかが実装されている事」
というような書き方をしてあるので違いが良く分かりませんでした。

引用:

Set において、要素が重複かどうかを判断するためには、equals メソッドを作る必要があります。equals メソッドを作って Set に add してみて、デバッガーなどで equals メソッドが呼ばれることを確認されると良いでしょう。
概念的には compare を作るとの同じ感じです。



equalsメソッドも実装したのですが、HashSetでは同じ結果となりました。
今回はTreeSetで実現できたので、これで行おうかと思います。
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2006-04-11 17:15
equals()をオーバーライドするなら、hashCode()もオーバーライドしましょう。
(by 「Effective Java」項目8 )

とくにHash〜なコレクションを使うときには、これを忘れるとひどい目に遭います。

[ メッセージ編集済み 編集者: びしばし 編集日時 2006-04-11 17:19 ]
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 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

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