- 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実装クラスを作成できれば完璧ですが、まだ時間がかかりそうです。
|