

登録した人の重複をチェックし、平均年齢を求めるプログラムを作り、現状以下のようになっています。平均年齢は求められるのですが、重複のチェックができていないようです。

[code]

    public class Main {
        
        public void main(String[] args) { 
            StudentInfo student = new StudentInfo(); 
            student.addStudents(new Student("Taro Sato","111",21)); 
            student.addStudents(new Student("Taro Sato","111",21)); 
            student.addStudents(new Student("Akari Kato","112",20)); 
            student.addStudents(new Student("Taizo Hayashi","113",23)); 
            student.addStudents(new Student("Hikari Watanabe","114",22)); 
                    
            double average = StudentInfo.getAverage(); 
            System.out.println("平均年齢:"+ average); 
            
        }
    }
    
    public class Student {
    
        String name ="";  //名前    
        String studentID ="";  //学生ID    
        int age ;   //年齢 
        public Object id;
    
        public Student(String name, String id, int age) {        
            this.name = name;        
            this.studentID = id;        
            this.age = age;
        }
        
        public String getName(){
            return name;
        }
        public String getId(){
            return studentID;
        }
        public int getage(){
            return age;
        }
    }
    
    public class StudentInfo {
        
        public static final int MAX_COUNT=100; //取り扱えるStudentの最大数;
        static Student[] students = new Student[ MAX_COUNT]; //管理するStudent
        static int studentCount =0;  //配列に格納されたStudentの数
    
        public String id ="";//初期化
        public String name ="";
        public int age =0 ;
    
        //・引数 ：student ／Student 追加する Student
        //・戻り値：追加できた時は true, 失敗したときはfalse を返す．
        //・目的 ：StudentInfo 内の配列に Student を追加する．引数の値が null である場合，
        //         配列で扱 える最大数を超えた場合や，既に同じ情報を持つ Student が登録されている場合は，
        //         登録されずにfalse を返す．
    
        public boolean addStudents(Student student){
            //引数にStudent以外のクラスが指定 された時はfalseを返す
            if(student instanceof Student != true )
                    return false;
            //配列で扱える最大数を超えた場合
            if(studentCount > MAX_COUNT || student == null){
                    return false;
                }
            //配列の要素を一つ一つ同じである かどうかを確認し，全て同じであれ ばtrueを返す
                Student target = (Student)student;
                //for文で重複チェック
                for(int i=0; i<=studentCount; i++){
                
                if(this.name.equals(target.name) && (this.id.equals(target.id)) && this.age == target.age)
                    return false;
                }
                    students[studentCount] = student;////student[studentCount]にstudentを代入
                    studentCount++;
                    System.out.println(studentCount); 
                
                    return true;                
                }
        
        //・引数 ：なし
        //・戻り値：配列に登録されている Studentの平均値
        //・目的 ：StudentInfo の配列に登録されている Student の平均年齢を算出して返す．
        //         登録され ている Student がない場合は0 を返す．
    
        public static double getAverage(){
            double average = 0.0;
                for(int i=0; i < studentCount; i++)
                    average += (double)students[i].getage();
                    System.out.println(average/studentCount); 
                return average/studentCount;
        }
    
[/code]


CC BY-SA 4.0
2020-07-05T08:45:46.513
68296
2020-07-12T06:23:13.073
2020-07-12T06:23:13.073
3060
34781
question
java array
配列の重複チェック


`Student.id`変数が初期化されていないので、`null`のままと思います。  
そのため、

[code]

    this.id.equals(...)
    
[/code]

メソッドの呼び出しで`NullPointerException`になっているように見受けます。

`id`メンバを適切に初期化すると事象解消すると思います。(※どういう値にしたいのかは、コード例からは予想できませんでした)

* * *

なお、文字列の比較は`==`演算子ではなく`equals`メソッドで行って正しいです。


CC BY-SA 4.0
2020-07-05T10:07:06.843
68299
2020-07-05T10:07:06.843
20098
68296
answer


いくつか直すべき箇所があるかと思われます。

・「配列の要素を一つ一つ同じであるかどうか確認」するために、配列の中の要素を繰り返し処理（for）で確認する必要があります。

[code]

    Student target = (Student)student;
    for(Student s : students){
        this.name = s.getName();
        this.id = s.getId();
        this.age = s.getAge();
        if(this.name.equals(target.getName()) || (this.id.equals(target.getId)) || (this.age == target.getAge())){
            return false;
        }
    }
    studentCount++;
    return true;
    
[/code]

・重複チェックを行う前に配列にデータを代入してしまっているので、もし重複していても、他のStudentのデータを上書きしてしまうことが予想されます。

[code]

    students[studentCount] = student;
    
[/code]

上記の処理を重複チェックの後に移動してみてはいかがでしょうか。

・StudentInfoクラス内でidがObjectクラスで定義されていますが、Studentクラスを見るにidはStringかと思われます。

[code]

    private String id = " ";
    
[/code]

に変えてみてはいかがでしょうか。


CC BY-SA 4.0
2020-07-09T03:02:51.667
68418
2020-07-09T03:02:51.667
41007
68296
answer