- PR -

ソート処理について

1
投稿者投稿内容
コージ
常連さん
会議室デビュー日: 2005/07/29
投稿数: 39
投稿日時: 2006-09-18 16:51
お聞きしたいことがあります。

class bean{
String name;
String a;
String b;
String c;
}

List<bean> list = new ArrayList<bean>;

このようなlistがあるとします。

このリストの各beanでNAMEが一致する場合
a(昇順),b(昇順),c(昇順)でソートし
そのソートした最初のbeanだけを
新たに用意した変数に入れ替えるという
プログラムはどのように書けばいいでしょうか?

SortedSet set = new TreeSet(Comparator comparator)など
Comparatorを使用してうまくできないかやっていますが
まったくできません。
アドバイスいただけないでしょうか。
よろしくお願いします

mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-09-18 17:29
Collections.sort()
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2006-09-18 18:30
日本語が微妙にわかりにくい…

1.まず「ORDER BY name, a, b, c」の条件でbeanを比較するComparatorを自前で
実装して、Collections.Sort()でソートする。

2.ソート済みのlistを走査し、直前の要素と異なるnameを持つbeanを
検出して、「新たに用意した変数」とやらに入れてやる。

うーん、エレガントさに欠ける気がするけど、こんなところかな。
コージ
常連さん
会議室デビュー日: 2005/07/29
投稿数: 39
投稿日時: 2006-09-18 21:12
すみません。ありがとうございます。
ソートと重複を削除を一度に行わず。
分けて考えたいと思います。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-09-18 21:23
TreeSetは全く関係ない話で、
Comparatorの実装がマズイと思うのですが、
上手くいかないと仰るComparatorの実装のコードを
載せてみてはいかがでしょうか。
kuma
大ベテラン
会議室デビュー日: 2004/02/25
投稿数: 110
投稿日時: 2006-09-18 21:31
私なら
1.a,b,cでbeanを比較するComparatorを実装
2.beanのname重複判定用Mapと入れ替え候補用Mapをkeyにbeanのname、valueにbeanとして作成
3.Listの先頭からbeanに対して4-5の処理を繰り返す
4.各beanを重複判定用Map#containsKeyでnameが重複しているか判断
 重複していれば5へ
 重複していなければ重複判定用Mapにbeanを格納(次のbeanの判定に移動)
5.重複判定用Mapのbeanと現在処理しているbeanを1で実装したComparatorで比較
 重複判定用Mapのbeanが比較上先であれば、入れ替え候補用Mapのvalueを重複判定用Mapのbeanで更新
 現在処理しているbeanが比較上先であれば、重複判定用Mapと入れ替え候補用Mapのvalueを現在処理しているbeanで更新

最終的に入れ替え候補用Map#valuesで得られたものが
最初に用意されたList中にnameが一致するものが存在し、且つa,b,cで比較された最初のbeanのコレクション

としますかね
>そのソートした最初のbeanだけを
>新たに用意した変数に入れ替えるという

これの内容によってはMapが1つで済むんですが・・
1

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