• ベストアンサー

Vectorを用いた問題

JAVAをはじめたばかりなのですが、以下の問題が分かりません。 Lessonクラス内のaddメソッドにおいてaddした結果が常に学籍番号の小さい順にソートしたいのですが、どうもVectorの使い方がわからず四苦八苦しております。 import java.util.Vector; class main { public static void main(String argv[]){ Lesson l = new Lesson("Kokugo","Tanaka",100); l.add(new Student("00005","Suzuki",100)); l.add(new Student("00002","Sato",64)); l.add(new Student("00003","Ito",43)); l.add(new Student("00007","Endo",92)); l.print(); } } class Lesson { private String name; // 課題名 private String teacher; // 担当者 private int max; // 最大履修者数 private int num; // 登録履修者数 Vector<Student> st; // Student class の配列 public Lesson(String l,String t,int n){ name=l; teacher=t; max=n; num=0; st=new Vector<Student>();// 配列の確保 } public boolean add(Student s){ if(num>=max){ return false;} else { if(num==0){st.insertElementAt(s,num++);} else{ for(int i=0;i<num;i++){ String p=(st.elementAt(i)).id; if(p.compareTo(s.id)>=0){ st.insertElementAt(s,i); } } } return true;} } public void print() { System.out.println("Lesson :"+name); System.out.println("Teacher :"+teacher); System.out.println("students:"+num); for(int i=0;i<num;i++){ st.elementAt(i).print_short(); } System.out.println(); System.out.println("----------"); } } class Student{ public String id; // 学籍番号 private String name; // 名前 private int grade; // 成績 Student(String i,String n, int g){ id=i; name=n; if(g<0)grade=0; else if (g>100) grade=100; else grade=g; } public void print_short() { System.out.println(id+","+name+","+grade); } } 実行結果 Lesson :Kokugo Teacher :Tanaka students:1 00002,Sato,64 ---------- 学籍番号の順にソートしたいのですが、どうやら学籍番号の一番小さいものしか表示されていないようです。どのようにしたらよいのか教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

import java.util.Vector; public class Q3262941{ public static void main(String argv[]){ Lesson l = new Lesson("Kokugo","Tanaka",100); /* テストの都合上順番変わってます */ l.add(new Student("00007","Endo",92)); l.add(new Student("00005","Suzuki",100)); l.add(new Student("00002","Sato",64)); l.add(new Student("00003","Ito",43)); l.print(); } } class Lesson { private String name; // 課題名 private String teacher; // 担当者 private int max; // 最大履修者数 private int num; // 登録履修者数 Vector<Student> st; // Student class の配列 public Lesson(String l,String t,int n){ name=l; teacher=t; max=n; num=0; st=new Vector<Student>();// 配列の確保 } public boolean add(Student s){ if(num>=max){ return false;} else { if(num==0){st.insertElementAt(s,num++);} else{ boolean isRecorded = false; for(int i=0;i<num;i++){ String p=(st.elementAt(i)).id; if(p.compareTo(s.id)>=0){ System.out.println("通過1"); st.insertElementAt(s,i); num = num + 1; /* 増やすの忘れているぞ */ isRecorded = true; break; /* Let's have a break!下手するとがんがん追加されちゃいます */ } } if (isRecorded == false){ /* 今から追加したい奴が一番デカイのに番兵がいませんでした */ st.insertElementAt(s,num); num = num + 1; } } return true; } } public void print() { System.out.println("Lesson :"+name); System.out.println("Teacher :"+teacher); System.out.println("students:"+num); for(int i=0;i<num;i++){ st.elementAt(i).print_short(); } System.out.println(); System.out.println("----------"); } } class Student{ public String id; // 学籍番号 private String name; // 名前 private int grade; // 成績 Student(String i,String n, int g){ id=i; name=n; if(g<0)grade=0; else if (g>100) grade=100; else grade=g; } public void print_short() { System.out.println(id+","+name+","+grade); } }

sin1224
質問者

お礼

確かに動作しました。ありがとうございました。 少しソート方法を確認したほうがよかったですね。 番兵とかあまり思いつきませんでした。

その他の回答 (2)

  • world99
  • ベストアンサー率64% (20/31)
回答No.3

Lessonクラスのaddメソッドに2点問題があると思います。 次のように修正したら、うまく動作しました。確認してみて下さい。 1.Vectorへの初回データ挿入時のnum値のインクリメント場所が不正。  numのインクリメントをVector.insertElementAt()実行時に行うように修正。 2.Vectorに登録されているデータよりid値の大きなデータの登録が漏れている。  処理追加しました。 class Lesson { public boolean add(Student s) { if (num >= max) { return false; } else { if (num == 0) { //st.insertElementAt(s, num++); st.insertElementAt(s, num); num++; } else { boolean flg = false; for (int i = 0; i < num; i++) { String p = (st.elementAt(i)).id; if (p.compareTo(s.id) >= 0) { st.insertElementAt(s, i); num++; flg = true; break; } } // 登録されているデータより大きいid値のデータの場合、 // 一番最後に追加する。 if(!flg) { st.addElement(s); num++; } } return true; } } }

sin1224
質問者

お礼

確認しました。きちんと動きました!ありがとうございました!

回答No.2

追記: 検証はしてないが numって http://java.sun.com/j2se/1.5.0/docs/api/java/util/Vector.html#size() sizeを使えば別にいらないんでは?

sin1224
質問者

お礼

まだあまりJAVAに詳しくないので・・ いろいろ道具があるのですね。

関連するQ&A

専門家に質問してみよう