ArrayList.remove()没有删除对象

vai*_*dil 9 java arraylist

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

司机班:

import java.util.ArrayList;
import java.util.Scanner;

public class Driver {
private ArrayList<Student> students;
private ArrayList<Instructor> instructors;

public static void main(String[] args) {        
    Driver aDriver = new Driver();
    aDriver.run();      
}

public Driver() {
    students = new ArrayList<Student>();
    instructors = new ArrayList<Instructor>();
}

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");
}
}
Run Code Online (Sandbox Code Playgroud)

学生班:

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;
}
}
Run Code Online (Sandbox Code Playgroud)

讲师班:

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;
}
}
Run Code Online (Sandbox Code Playgroud)

Dan*_* D. 16

您必须正确覆盖equals()两者StudentInstructor类的方法.

当覆盖等于时,也可以覆盖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();
}
Run Code Online (Sandbox Code Playgroud)

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

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


Ami*_*nde 7

您需要覆盖集合的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
}
Run Code Online (Sandbox Code Playgroud)

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

 @Override
public int hashCode() {
    return id == null ? 0 : id.hashCode();
}
Run Code Online (Sandbox Code Playgroud)


Jac*_*ack 6

你没有覆盖的方法equals进行StudentInstructor.

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

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