- PR -

名簿管理のsortメソッド

1
投稿者投稿内容
未記入
会議室デビュー日: 2005/07/06
投稿数: 2
投稿日時: 2005-07-06 23:49
******** 状況   ************************************************
以下のプログラムで名簿のデータを辞書順(同じ場合は年齢順)に
ソートするメソッドの作成方法を教えていただけませんか?
別にPersonクラスでStringで名前を、intで年齢をセットしています。

******** ソース ************************************************
import java.util.*;
import java.io.*;

public class Meibo{
private Vector vec;
public Meibo(){
vec=new Vector();
}
public Vector getVec(){
return vec;
}
public void displayAll(){
for(int i=0;i<vec.size();i++){
Person p=(Person)vec.elementAt(i);
p.display();
}
}
public void insert(Person p){
vec.add(p);
}
public void manage(){
insert(new Person("Yamada",30));
insert(new Person("Suzuki",25));
insert(new Person("Sato",28));
insert(new Person("Suzuki",19));
}
public void sort(){
・・・・・・
}
public void menu(){
try{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
boolean flag=true;
while(flag){
System.out.print("MENU(add,display,end):");
String s=br.readLine();
if(s.equals("add")){
addMenu(br);
}else if(s.equals("display")){
displayAll();
}else if(s.equals("end")){
flag=false;
System.out.println("Bye");
}}}
}
private void addMenu(BufferedReader br){
Person pe=new Person();
pe.inputData(br);
insert(pe);
}
public static void main(String args[]){
Meibo pm=new Meibo();
pm.manage();
pm.menu();
}
}
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-07-07 00:09
java.utl.Arrays#sortでソートすりゃいいと思います。

1・Presonクラスにはjava.lang.Comparableを実装する。
2・java.util.Vector#toArrayで、オブジェクトの配列に変換
3・java.util.Arrays#sortメソッドで、変換した配列をソート
4・java.util.Vectorに対して再設定

ってな感じで。

いちいちソート用のメソッドを実行しなきゃキチンと並ばないのはおかしいのでは?
そういう仕様なら仕方がないですが・・・
通常はjava.util.TreeMap/TreeSetなどを利用して、
値を設定した段階でソートが行われるようにするのが正しい実装方法だと思います。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-07-07 10:03
unibon です。こんにちわ。

引用:

かつのりさんの書き込み (2005-07-07 00:09) より:
いちいちソート用のメソッドを実行しなきゃキチンと並ばないのはおかしいのでは?
そういう仕様なら仕方がないですが・・・
通常はjava.util.TreeMap/TreeSetなどを利用して、
値を設定した段階でソートが行われるようにするのが正しい実装方法だと思います。


ちなみに私は TreeMap や TreeSet は、ほとんど使ったことがありません。数百件程度までなら、ソートにそんなに時間がかからないので、オンデマンドでソートしたほうが簡単だと思います。また、アプリケーションの仕様にもよりますが、ユーザーが View を切り替えることでソート用の Comparator を切り替えたいこともあるので、常にソート済みの状態を持つことはそれほどメリットはないのではないでしょうか。
もちろん、対象が何万件もあればソートのコストを気にしないといけなくなるので TreeMap や TreeSet はそのときには威力が発揮されるでしょう。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-07-07 12:53
「おかしいのでは」というのは言いすぎでしたね。。。

要件にもよるのですが、
・ソート順が変わる場合はオンデマンドでのソートを提供する
・ソート順が一定なら、格納時にソート
ですね。。。

コード:
数百件程度までなら、ソートにそんなに時間がかからないので、オンデマンドでソートしたほうが簡単だと思います。


ソート順が一定なら、TreeSetやTreeMapを使えば問題ないないし、
別に難しく考える必要もないと思います。
それにレコードが追加される度にソートするのは無駄のような気がします。
2分木にレコードを追加する場合は通常のソートと違い、
殆どコストはかからないですし。
あくまで、ソート順が一定の場合ですが。

ここら辺って、好みの問題かな。
未記入
会議室デビュー日: 2005/07/06
投稿数: 2
投稿日時: 2005-07-07 20:22
皆様のご意見を参考に今日試してみた所完成させることが出来ました。
どうもありがとうございました。
1

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