Java 如何不允许用户在ArrayList中的对象中输入重复条目
我创建了一个程序来输入学生的详细信息,如姓名和卷号。卷号必须唯一,用户不能为同一卷号添加多条记录。我已经创建了3个类,student类,StumMaster类,在调用主函数时有ArrayList和main类。 以下是主要课程: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
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签名:学生地址、姓名、卷号、标记;