- 締切済み
java名簿管理プログラム
以下の名簿管理プログラムで削除と名前の辞書順ソートのメソッドの作り方を教えていただけませんか? public class Meibo{ private Vector vec; public Meibo(){ vec=new Vector(); } public void insert(Person p){ vec.add(p); } public void delete(String name){ } public void sort(){ } /* PersonオブジェクトではStringで名前を、intで年齢を定義し入力しています */ かなり局部的にしか載せていないので非常に分かり難いとは思いますがどうかよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- ngsvx
- ベストアンサー率49% (157/315)
ソートに関してです。 #2の方はjava.lang.Comparableを紹介されていますが、 この方法は、 1.レコードとなるオブジェクトにComparableを実装していなければならない。 2.オブジェクトにソート条件を実装するため、昇順や降順などソート条件を変化させる場合のコードが面倒。 ということがあります。 私がお勧めするのは、java.util.Comparatorを実装する方法です。 やり方は、int compare(Object a, Object b)を実装したクラスを作ってCollections.sort(List, Comparator)に渡します。 Class SortLogic { public int compare(Object a, Object b){ //ここに比較条件を記述します。 //aが小さければマイナス、大きければプラス、同じなら0を返します。 } } あとは、 Collections.sort(vector, new SortLogic()); とすれば完了です。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>どこが間違えているのか 文字列の並びが同値かどうかは、 equals を使います ==を使うとオブジェクトの同値かどうかを調べることになります。
お礼
BLUEPIXY様 2度のご回答どうもありがとうございます。 equalsを使って早速試してみたいと思います。 どうもありがとうございました。
- osumitan
- ベストアンサー率33% (102/307)
削除は、Vectorのremoveメソッドを使います。 remove(int index) なら、要素のインデックスを指定します。 remove(Object o) なら、要素そのものを指定します。 (厳密にはequalsメソッドの戻りがtrueになるものが削除されます) 削除する条件から、番号か、要素自体を特定してください。 ソートは、java.util.Collectionsのsortメソッドを使います。 Collections.sort(vec); ただし、vecの要素(この場合Personクラス)がjava.lang.Comparableを 実装している必要があります。 そして、public int compareTo(Object o)メソッドを作成する必要があります。 引数は比較対象のインスタンス(通常は同じ型)が渡されます。 ソート条件により、自分自身が前なら<0、同じなら0、後なら>0を返します。 以下は、名前の昇順+年齢の昇順の条件でソートする例です。 public class Person implements Comparable { private String name; private int age; public int compareTo(Object o) { Person cmp = (Person)o; int cmpname = this.name.compareTo(cmp.getName()); if(cmpname != 0) { return cmpname; } return this.age - cmp.getAge(); } public String getName() { return this.name; } public int getAge() { return this.age; } } StringもcompareToを実装しているので、compareToが使えます。 結果は、先頭から1文字ずつ比較していく形になります。
補足
ご丁寧な回答ありがとうございました。 ただremoveについてですが、参考にさせて頂いて public void delete(String na){ for(int i=0;i<vec.size();i++){ Person p=(Person)vec.elementAt(i) if(p.name==na) vec.remove(i); } } というメソッドを作ったのですがremoveされません・・・。全く見当違いな事をしているのかもしれませんが、どこが間違えているのか教えていただけませんか?よろしくお願いします。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
vectorの並び替えについては、参考URLが参考になると思います。 deleteについては、とりあえず、順番にvectorの保持するデータをみていってそのインデックスで vec.remove(インデックス); で削除します。
お礼
ご回答ありがとうございます。 まだ出来ていないので早速試してみたいと思います。