- PR -

Beanの比較について2

投稿者投稿内容
OZ
常連さん
会議室デビュー日: 2006/02/27
投稿数: 45
投稿日時: 2006-05-16 13:47
Kazukiさん、ありがとうございます。

引用:

コード:
public class SampComparator implements Comparator<BeanSamp> {
	private Comparator<BeanSamp> COMP_HEIGHT = new ...(略);
	private Comparator<BeanSamp> COMP_WEIGHT = new ...(略);
	private Comparator<BeanSamp> COMP_BLOOD = new ...(略);
	
	public int compare(BeanSamp o1, BeanSamp o2) {
		int compHeight = COMP_HEIGHT.compare(o1, o2);
		if(compHeight != 0) {
		  return compHeight;
		}
		
		int compWeight = COMP_WEIGHT.compare(o1, o2);
		if(compWeight != 0) {
			return compWeight;
		}
		
		return COMP_BLOOD.compare(o1, o2);
	}
}

Arrays.sort(beans, new SampComparator());


ベタベタに書くとこんな感じです。
まず、heightで比較。
heightで比較した結果が等しくない場合は、heightの比較結果を返す。
heightが等しい場合は、weightで比較。
weightで比較した結果が等しくない場合は、weightの比較結果を返す。
最後にbloodで比較。
bloodの比較結果を返す。
という動きです。
このComparatorを使うと背の順。背が同じ人は体重の順。体重も同じ人は血液型順で並びます。

OZさんの示した
コード:
1 : SampBean[] beans;
2 : ・・・
3 : Arrays.sort(beans,CMP_HEIGHT);
4 : Arrays.sort(beans,CMP_WEIGHT);
5 : Arrays.sort(beans,CMP_BLOOD);


は、結局血液型の順番にしかなりません。



詳細な説明ありがとうございます。やっと理解できました。

ただ、
コード:
Comparator<BeanSamp> cmp_hwb = new CompositeComparator<BeanSamp>(CMP_HEIGHT, CMP_WEIGHT, CMP_BLOOD);


の引数を動的に複数並べる方法が分からなかったので、Comparatorの配列を引数にして試したところ
思ったような結果が返ってきました。
コード:
public class CompositeComparator implements Comparator{
	private final Comparator[] comparators;
	private int count = 0;
	public CompositeComparator(Comparator[] comparators){
		this.comparators = comparators;
		this.count = this.comparators.length; 
	}
	
	public int compare(Object o1,Object o2){
		for(int i=0;i<count;i++){
			int tmp = comparators[i].compare(o1,o2);
			if(tmp!=0){
				return tmp;
			}
		}
		return 0;
	}
}


(ひょっとしてこれも間違った事をしていますか?)

あとは、びしばしさんからアドバイス頂いた、リフレクションを使って汎用的に使える
Comparator実装クラスを作成できれば完璧ですが、まだ時間がかかりそうです。
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2006-05-17 22:57
大丈夫ですよ。

引数をいっぱい並べる方法は「Java 可変長引数」あたりで検索すれば
解説サイトがいくつかみつかると思います。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-05-18 02:11
引用:

OZさんの書き込み (2006-05-16 13:47) より:
あとは、びしばしさんからアドバイス頂いた、リフレクションを使って汎用的に使える
Comparator実装クラスを作成できれば完璧ですが、まだ時間がかかりそうです。


BeanUtilsで簡単にできますよ?

コード:
org.apache.commons.beanutils.PropertyUtils.getProperty(bean, "プロパティ名")


これで返って来た値で比較するだけの話です。
OZ
常連さん
会議室デビュー日: 2006/02/27
投稿数: 45
投稿日時: 2006-06-07 10:01
Kazukiさん、あしゅさん、情報を頂きながらすっかり
返事が遅くなり申し訳ございませんでした。

差し当たり、最低限やりたい事はできているので、この件については
優先度を下げているのですが、貴重な情報を頂いたので完全に実装しようと
思います。

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