ArrayList.remove()不会删除对象

我知道这是一个混乱的实现,但我基本上有这个代码(我写了所有这些),并且我需要能够在使用适当的菜单选项时从列表中删除学生或教师。 代码中的其他所有内容都可以使用,而不是菜单选项3和4.我在尝试删除时输入的对象信息完全相同。 这是代码。 所有三个class级都在下面。

司机class:

import java.util.ArrayList; import java.util.Scanner; public class Driver { private ArrayList students; private ArrayList instructors; public static void main(String[] args) { Driver aDriver = new Driver(); aDriver.run(); } public Driver() { students = new ArrayList(); instructors = new ArrayList(); } private void run() { Student aStudent; Instructor anInstructor; Scanner inp = new Scanner(System.in); int choice = -1; String str = "Enter a menu option:\n"; str += " 0: Quit\n"; str += " 1: Add new student\n"; str += " 2: Add new instructor\n"; str += " 3: Delete existing student\n"; str += " 4: Delete existing instructor\n"; str += " 5: Print list of students\n"; str += " 6: Print list of instructors\n"; str += "Your choice: "; do { System.out.print(str); choice = inp.nextInt(); switch(choice) { case 0: System.out.println("Thanks! Have a great day!"); break; case 1: aStudent = getStudentInfo(); addStudent(aStudent); break; case 2: anInstructor = getInstructorInfo(); addInstructor(anInstructor); break; case 3: aStudent = getStudentInfo(); deleteStudent(aStudent); break; case 4: anInstructor = getInstructorInfo(); deleteInstructor(anInstructor); break; case 5: printStudents(); break; case 6: printInstructors(); break; default: System.out.println("Invalid menu item " + choice); } } while(choice != 0); } public Student getStudentInfo() { Student aStudent; String name = null; String id = null; double GPA = 0.0; Scanner inp = new Scanner(System.in); System.out.print("\n\nEnter the student's name: "); name = inp.nextLine(); System.out.print("Enter the student's ID: "); id = inp.nextLine(); System.out.print("Enter the student's GPA: "); GPA = inp.nextDouble(); aStudent = new Student(name, id, GPA); return aStudent; } public Instructor getInstructorInfo() { Instructor anInstructor; String name = null; String id = null; String dept = null; String email = null; Scanner inp = new Scanner(System.in); System.out.print("\n\nEnter the instructor's name: "); name = inp.nextLine(); System.out.print("Enter the instructor's ID: "); id = inp.nextLine(); System.out.print("Enter the instructor's department: "); dept = inp.nextLine(); System.out.print("Enter the instructor's email address: "); email = inp.nextLine(); anInstructor = new Instructor(name, id, dept, email); return anInstructor; } public void addStudent(Student aStudent) { students.add(aStudent); } public void addInstructor(Instructor anInstructor) { instructors.add(anInstructor); } public void deleteStudent(Student aStudent) { students.remove(aStudent); } public void deleteInstructor(Instructor anInstructor) { instructors.remove(anInstructor); } public void printStudents() { System.out.println("\n\n" + Student.printHeader()); for(int i = 0; i < students.size(); i++) { System.out.print(students.get(i)); } System.out.print("\n\n"); } public void printInstructors() { System.out.print("\n\n" + Instructor.printHeader()); for(int i = 0; i < instructors.size(); i++) { System.out.print(instructors.get(i)); } System.out.print("\n\n"); } } 

学生class:

 public class Student { private String name; private String id; //String to allow for the possibility of leading zeroes private double GPA; public Student() { name = "TestFirst TestLast"; id = "00000"; GPA = -1.00; } public Student(String name1, String id1, double GPA1) { name = name1; id = id1; GPA = GPA1; } public static String printHeader() { String str = String.format("%-25s%-7s%-6s\n", "Name", "ID", "GPA"); return str; } public String toString() { String str = String.format("%-25s%-7s%-6.3f\n", name, id, GPA); return str; } public String getName() { return name; } public void setGPA(double GPA2) { GPA = GPA2; } } 

讲师class:

 public class Instructor { private String name; private String id; private String dept; private String email; public Instructor() { name = "TestFirst TestLast"; id = "-00001"; dept = "TestDept"; email = "test@test.net"; } public Instructor(String name1, String id1, String dept1, String email1) { name = name1; id = id1; dept = dept1; email = email1; } public static String printHeader() { String str = String.format("%-30s%-6s%-15s%-15s\n", "Name", "ID", "Department", "Email Address"); return str; } public String toString() { String str = String.format("%-30s%-6s%-15s%-15s\n", name, id, dept, email); return str; } public String getName() { return name; } } 

您必须正确覆盖StudentInstructor类的equals()方法。

当覆盖equals时,最好也覆盖hashCode() 。 新学生(姓名,身份证,GPA);

例如,像这样:

 public boolean equals(Object o) { if (!(o instanceof Student)) { return false; } Student other = (Student) o; return name.equals(other.name) && id.equals(other.id) && GPA == other.GPA; } public int hashCode() { return name.hashCode(); } 

这样,您就有机会让ArrayList找出哪个对象与您在删除时作为参数传递的对象相对应。 如果你不覆盖上面的方法,它将使用Object的默认实现,它比较在删除新的Student对象时肯定不同的内存地址。

您可以在Object的javadocs中阅读有关2种方法的更多信息。

您需要覆盖集合的equals和hashcode方法才能正常工作。

 @Override public boolean equals(Object obj) { if (obj == null) return false; if (!(obj instanceof Student)) return false; Student other = (Student) obj; return id == null ? false : id.equals(other.id);//Compare Id if null falseF } 

由于您只使用ArrayList,因此不会使用hashcode方法,但提供它仍然是一种很好的做法。

  @Override public int hashCode() { return id == null ? 0 : id.hashCode(); } 

您没有覆盖StudentInstructor的方法equals

ArrayList使用此方法来检查两个对象是否相同。 如果没有自定义实现,它只会检查引用,这在您的情况下会有所不同,因为它们是两个不同的对象。

要提供自定义相等性,您必须检查所涉及类的所有字段是否相同。 这可以通过在实例变量上调用equals来递归完成。

覆盖学生和教师的equals方法将起作用:

以下是Student类的示例:

 public boolean equals(Object other){ if(other == null) return false; if(other == this) return true; if(!(other instanceof Student)) return false; Student otherStudent = (Student)other; return otherStudent.id.equals(this.id); } 

您可能还想覆盖hashCode()

 public String hashCode(){ return new HashCodeBuilder(17, 31). append(name). append(id). toHashCode(); }