0

学生の配列から学生を削除する方法があります。これは私がこれまでに持っているものですが、うまくいかないようです。

public Student[] removeStudent(Student s) throws Exception{
    boolean found =  false;
    for(int i = 0; i < nrStudents(this); i++){
        if(students[i].equals(s)){
            students[i] = null;
            found = true;
            break;
        }

    }
    if (found == true){
        return compact(students);
    }
    else
        throw new Exception("Student Not Found.");
}

private Student[] compact(Student[] arr){
    ArrayList<Student> list = new ArrayList<Student>();
    for (Student s : arr){
        if (!s.equals(null))
            list.add(s);
    }
    arr = list.toArray(new Student[list.size()]);
    return arr;
}

配列に 2 人以上の生徒がいる場合、NullPointerException が発生します。その配列から生徒を削除するにはどうすればよいですか?

4

4 に答える 4

3

nullをチェックするために.equals()を使用しないでください-コードを修正するには、if(!s.equals(null))行を。に変更しますif (s != null)

なんで?

Java nullチェックなぜ.equals()の代わりに==を使用するのか

ArrayListを使用すると、この問題の方が理にかなっています。私はそれを調べることをお勧めします-いくつかの良い使用例とソースがあります。

于 2013-01-21T18:45:57.903 に答える
0

これは私がそれを修正するためにしたことです

private Student[] compact(Student[] arr){
    Student[] stud = new Student[arr.length];
    int count = 0;
    for(int i = 0; i < arr.length; i++){
        if(arr[i] != null){
            stud[count] = arr[i];
            count++;
        }
    }
    students = stud;
    return students;
}

最初に生徒をnullに設定し、compact helperメソッドを使用して配列を圧縮し、null要素がないようにします。

于 2013-01-21T18:58:33.243 に答える
0

null データを除くすべてのデータをまったく新しい配列にコピーする必要があると確信しています。これはコストのかかる操作であるため、ArrayLists http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.htmlをお勧めします。

配列リストを使用すると、インデックスで参照できるという利点が得られますが、次のように単純に要素を削除することもできます。

if(node.data==null) {
     remove(node);
}
于 2013-01-21T18:46:21.500 に答える
0

以下:

    if (!s.equals(null))

読むべき

    if (s != null)
于 2013-01-21T18:47:19.023 に答える