无法从ArrayList中删除所需对象

时间:2015-08-29 17:21:50

标签: java arraylist

这是一个更大的任务的一部分,我对Java和编程都是全新的。我是系统和网络管理员,而不是开发人员。因此,诸如“studentId作为int会更好”之类的东西没有用,因为String是赋值的必要条件。

我需要根据studentId从Student对象中删除一个对象。我在StackOverflow上找到了从对象的ArrayList中删除对象的代码,它主要起作用。我遇到的问题是,如果对象不存在,我希望能够创建一些说该对象不存在的东西。目前,在删除正确的对象(在我的示例中为studentId为“3”)之后,它将继续删除数组中的最后一个对象,直到不再有索引为3的对象。显然,我没有一个线索,为什么。

public static void remove(String sdId){

    Iterator<Student> it = studentList.iterator();
    while(it.hasNext()) {
      Student id = it.next();
      if(id.getStudentId().equals(sdId)) {
        it.remove();
      }
    }

}
正在调用

public static void main(String args[]) {

    studentList = new ArrayList();
    populateStudents(); // convert array of strings to ArrayList of student objects


    ((Student)studentList.get(0)).print();
    ((Student)studentList.get(1)).print();
    ((Student)studentList.get(2)).print();
    ((Student)studentList.get(3)).print();
    ((Student)studentList.get(4)).print();

    System.out.println();
    remove("3");
    ((Student)studentList.get(0)).print();
    ((Student)studentList.get(1)).print();
    ((Student)studentList.get(2)).print();
    ((Student)studentList.get(3)).print();

    System.out.println();
    remove("3");
    ((Student)studentList.get(0)).print();
    ((Student)studentList.get(1)).print();
    ((Student)studentList.get(2)).print();
}

正在输出:

1    First Name: John    Last Name: Smith    E-mail: John1989@gmail.com  Age: 20     Grades: {88, 79, 59}
2    First Name: Suzan   Last Name: Erickson     E-mail: Erickson_1990@gmailcom  Age: 19     Grades: {91, 72, 85}
3    First Name: Jack    Last Name: Napoli   E-mail: The_lawyer99yahoo.com   Age: 19     Grades: {85, 84, 87}
4    First Name: Erin    Last Name: Black    E-mail: Erin.black@comcast.net  Age: 22     Grades: {91, 98, 82}
5    First Name: John    Last Name: Reid     E-mail: JohnReid@WGU.edu    Age: 44     Grades: {98, 99, 98}

1    First Name: John    Last Name: Smith    E-mail: John1989@gmail.com  Age: 20     Grades: {88, 79, 59}
2    First Name: Suzan   Last Name: Erickson     E-mail: Erickson_1990@gmailcom  Age: 19     Grades: {91, 72, 85}
4    First Name: Erin    Last Name: Black    E-mail: Erin.black@comcast.net  Age: 22     Grades: {91, 98, 82}
5    First Name: John    Last Name: Reid     E-mail: JohnReid@WGU.edu    Age: 44     Grades: {98, 99, 98}

1    First Name: John    Last Name: Smith    E-mail: John1989@gmail.com  Age: 20     Grades: {88, 79, 59}
2    First Name: Suzan   Last Name: Erickson     E-mail: Erickson_1990@gmailcom  Age: 19     Grades: {91, 72, 85}
4    First Name: Erin    Last Name: Black    E-mail: Erin.black@comcast.net  Age: 22     Grades: {91, 98, 82}

在最后一组版画中,如果我第四次调用它,我会得到一个outOfBounds。我没有为输出创建一个循环,因为它只是用于测试而不是实际使用的东西 - 我还没有创建该函数。

1 个答案:

答案 0 :(得分:0)

如果要根据ID删除学生对象。我会假设您每次调用remove方法时都要删除one and only one学生。

因此,您不应该使用while循环来遍历列表。 for循环适用于获取包含您要删除的ID的学生对象。

public static void remove(String sdId){
    Student stud = null;
    for(Student s : studentList){
        if(s.getStudentId().equals(sdId))
            stud = s;
    }
    if(stud != null)
        studentList.remove(stud);
    else
        System.out.println("ID does not exist."); //optional
}

这将确保您只删除1名学生,如果该ID不存在,则删除方法不执行任何操作。当然,您也可以使用迭代器遍历列表。