JAVAで学生の名前、ID、年齢を配列に入れ、重複チェック後に平均年齢を求めるプログラムを作っています。現在のところ、平均値を求めることはできるようになったのですが、重複チェックができていません。以下現状のプログラムです。
public class Student {
public String name;// =""; //名前 String studentID;// =""; //学生ID public int age ; //年齢 public String id;//="";
public Student(String name, String id, int age) {
this.name = name;
this.studentID = id;
this.age = age;
}
public int getage(){
return age;
}
}
public class StudentInfo {
public static final int MAX_COUNT=100; //取り扱えるStudentの最大数; Student[] students = new Student[ MAX_COUNT]; //管理するStudent、ここに int studentCount =0; //配列に格納されたStudentの数 //・引数 :student /Student 追加する Student //・戻り値:追加できた時は true, 失敗したときはfalse を返す. //・目的 :StudentInfo 内の配列に Student を追加する.引数の値が null である場合, // 配列で扱 える最大数を超えた場合や,既に同じ情報を持つ Student が登録されている場合は, // 登録されずにfalse を返す. public boolean addStudents(Student student){ System.out.println("0studentCount開始"+studentCount); if(studentCount==0){ students[studentCount] = student; studentCount++; System.out.println("1"+students[0].getname());//チェック1 System.out.println("1"+students[0].getage()); System.out.println("1"+students[0].getid()); System.out.println("1studentCount開始"+studentCount); }else{ System.out.println("2"+student.getname());//チェック2 System.out.println("2"+student.getage()); System.out.println("2"+student.getid()); System.out.println("2studentCount開始"+studentCount); } //引数にStudent以外のクラスが指定 された時はfalseを返す if(student instanceof Student != true ){ System.out.println("3if(student instanceof Student != true )"); //チェック3 return false; } System.out.println("4if(student instanceof Student != true )抜けた"); //チェック4 //配列で扱える最大数を超えた場合 if(studentCount > MAX_COUNT || student == null){ System.out.println("5if(studentCount > MAX_COUNT || student == null)"); //チェック5 return false; } System.out.println("6if(studentCount > MAX_COUNT || student == null)抜けた"); //チェック6 //配列の要素を一つ一つ同じである かどうかを確認し,全て同じであれ ばtrueを返す //for文で重複チェック for(int i=0; i<=studentCount; i++){ //if(student.getname().equals(students[i].getname()) && student.getid().equals(students[i].getid()) && student.getage() == students[i].getage()){ if(student.equals(students[i])){ return true; } } students[studentCount] = student;//student[studentCount]にstudentを代入 studentCount++; System.out.println("7-1"+student.getname()); //チェック7-1 System.out.println("7-2"+students[0].getname()); //チェック7-2 System.out.println("8studentCount一周終わり"+studentCount); //チェック8 return false; } //・引数 :なし //・戻り値:配列に登録されている Studentの平均値 //・目的 :StudentInfo の配列に登録されている Student の平均年齢を算出して返す. // 登録され ている Student がない場合は0 を返す. public double getAverage() { double average = 0.0; for (int i = 0; i < this.studentCount; i++) average += (double) this.students[i].getage(); //System.out.println( average += (double) this.students[i].getage()); //チェック9 System.out.println("9平均"+average / this.studentCount); //チェック return average / this.studentCount; }
}
import static org.junit.Assert.*;
import org.junit.Test;
public class StudentInfoTest {
@Test public void testAddStudents() { StudentInfo stu = new StudentInfo(); stu.addStudents(new Student("Taizo Hayashi","113",23)); stu.addStudents(new Student("Hikari Watanabe","114",21)); stu.addStudents(new Student("Hikari Watanabe","114",21)); stu.addStudents(new Student("Taro Sato","111",23)); stu.addStudents(new Student("Akari Kato","112",22)); double average = StudentInfo.getAverage(); assertEquals(22.00, average, 0.0); }
}
students[0].getname()や.getage()であれば要素を取り出せるのですが、students[studenCount].getname()やstudents[i].getname()だと要素を取り出せません。
また、students[studenCount]=studentとした場合はnullになるのですが、students[0]=studentとした場合は中身があり、getname()や.getage()であれば要素を取り出せます。
iやstudentCountはループで回したりカウントアップしているのに0などの数字と何か違いがあるのでしょうか。
回答2件
あなたの回答
tips
プレビュー