Java 如何不允许用户在ArrayList中的对象中输入重复条目

Java 如何不允许用户在ArrayList中的对象中输入重复条目,java,arraylist,Java,Arraylist,我创建了一个程序来输入学生的详细信息,如姓名和卷号。卷号必须唯一,用户不能为同一卷号添加多条记录。我已经创建了3个类,student类,StumMaster类,在调用主函数时有ArrayList和main类。 以下是主要课程: public static void main(String[] args) { boolean exit = false; Scanner input = new Scanner(System.in); do { System

我创建了一个程序来输入学生的详细信息,如姓名和卷号。卷号必须唯一,用户不能为同一卷号添加多条记录。我已经创建了3个类,student类,StumMaster类,在调用主函数时有ArrayList和main类。 以下是主要课程:

public static void main(String[] args) {

    boolean exit = false;
    Scanner input = new Scanner(System.in);

    do {
        System.out.println("Enter any option from below:");
        System.out.println("1 Enter new student");
        System.out.println("2 View all students");
        System.out.println("3 Exit");

        switch (input.nextInt()) {
        case 1:
            System.out.println("Enter the details of student: ");
            StuMaster stm = new StuMaster();
            stm.addStudentDetails();
            break;

        case 2:
            System.out.println("All the records are: ");
            StuMaster stm1 = new StuMaster();
            stm1.displayAllStudents();

        case 3:
            exit = true;
            System.exit(0);

        default:
            System.out.println("Invalid entry!");
        }

    } while (!exit);
}
学生班级:

public class Student {

private int rollNumber, marks;
public name;

public Student() {
    Scanner input = new Scanner(System.in);
    System.out.println("Enter roll number: ");
    rollNumber = input.nextInt();
    System.out.print("Enter name: ");
    name= input.next();
    System.out.println("Enter marks: ");
    marks = input.nextInt();
}

public String toString() {
    return "Name: " + name + "Roll no.: " + rollNumber + " ,Marks :" + marks;
}

public int getRollNo() {
    return this.rollNumber;
}
StuMaster类,其中调用了List并定义了添加学生的方法:

public class StuMaster {

static List<Student> stu = new ArrayList<Student>();
Student stuObj = new Student();

public List<Student> getStudents() {
    return stu;
}

public void addStudentDetails() {   

    stu.add(stuObj);
    System.out.println("Student record added! Following are the details that you added: \n" + stuObj);
}

public void displayAllStudents() {
    System.out.println("All the students in the system: ");
    for (Student s1 : stu) {
        System.out.println(s1);
    }
}
我是java新手,无法理解如何在addStudentDetails方法中应用StumMaster类的check。

如果您不想在集合中有重复项,您的程序需要使用Set而不是List。但是,我将向您展示一个在原程序基础上稍加修改的程序,从某些角度来看,我认为该程序更好:

1为每次迭代删除不必要的StuMaster实例化

2从构造函数中删除学生属性的创建

3更好的可读性

public class Student {
private String name;
private int rollNumber;
private int mark;

public Student(String name, int rollNumber, int mark) {
    this.name = name;
    this.rollNumber = rollNumber;
    this.mark = mark;
}

//equals and hashcode 

@Override
public String toString() {
   //to string override
}
}
您可以使用教程重写hashcode和equals方法

public class StudentManager {
private Set<Student> students = new HashSet<>();

public void addStudent(Student student) {
    students.add(student);
}

public void displayStudents() {
    for (Student student : students) {
        System.out.println(student);
    }
}
}
以及基于输入创建学生的新方法:

public static Student createStudent(Scanner input) {
    System.out.println("Enter roll number: ");
    int rollNumber = input.nextInt();

    System.out.print("Enter name: ");
    String name = input.next();

    System.out.println("Enter marks: ");
    int marks = input.nextInt();

    return new Student(name, rollNumber, marks);
}
注:为案例2添加了一个中断,否则每次你想显示学生时,它都会退出你的程序。

如果你不想在集合中有重复项,你的程序需要使用Set而不是List。但是,我将向您展示一个在原程序基础上稍加修改的程序,从某些角度来看,我认为该程序更好:

1为每次迭代删除不必要的StuMaster实例化

2从构造函数中删除学生属性的创建

3更好的可读性

public class Student {
private String name;
private int rollNumber;
private int mark;

public Student(String name, int rollNumber, int mark) {
    this.name = name;
    this.rollNumber = rollNumber;
    this.mark = mark;
}

//equals and hashcode 

@Override
public String toString() {
   //to string override
}
}
您可以使用教程重写hashcode和equals方法

public class StudentManager {
private Set<Student> students = new HashSet<>();

public void addStudent(Student student) {
    students.add(student);
}

public void displayStudents() {
    for (Student student : students) {
        System.out.println(student);
    }
}
}
以及基于输入创建学生的新方法:

public static Student createStudent(Scanner input) {
    System.out.println("Enter roll number: ");
    int rollNumber = input.nextInt();

    System.out.print("Enter name: ");
    String name = input.next();

    System.out.println("Enter marks: ");
    int marks = input.nextInt();

    return new Student(name, rollNumber, marks);
}

PS:为案例2添加了一个中断,否则每次您想要显示学生时,它都会退出您的程序。

在Student.java中,重写equals和hashCode。在StuMaster.java中,使用集合而不是列表。在Student.java中,重写equals和hashCode。在StuMaster.java中,使用集合而不是列表。@sebestian感谢您的解决方案。然而,我面临着一个我在上述问题中忘记提及的问题。student类中的一个变量是从另一个类person扩展而来的,该类person是另一个变量的地址。因此,它就像:`Class Student extensed Person{public StudentString name,String address,int rollno,int marks{superaddress;this.name=name;this.roll=rollno;this.marks=marks}我已经从address在person类中创建了getter和setter。问题是如何在address的静态createStudent方法中使用该getter setter?您可以像创建其他属性一样创建地址。System.out.printlnEnter address:;String address=input.next;然后您只需在构造函数中添加此参数r签名:Studentaddress、name、rollNumber、marks;@sebestian感谢您的解决方案。但是,我面临着一个问题,我在上面的问题中忘记提到。student类中的一个变量是从另一个类person扩展而来的,而另一个变量地址是另一个类person。因此,它类似于:`class student Extendes person{public StudentString name,String address,int rollno,int marks{superaddress;this.name=name;this.roll=rollno;this.marks=marks}我已经从address在person类中创建了getter和setter。问题是如何在address的静态createStudent方法中使用该getter setter?您可以像创建其他属性一样创建地址。System.out.printlnEnter address:;String address=input.next;然后您只需在构造函数中添加此参数r签名:学生地址、姓名、卷号、标记;