Java 在数组列表中搜索特定对象并打印数组列表中的所有对象

Java 在数组列表中搜索特定对象并打印数组列表中的所有对象,java,search,printing,arraylist,Java,Search,Printing,Arraylist,我必须实现一个java应用程序来演示对象数组列表的使用。我使用学生,我有一个学生测试班。我应该能够输入详细信息(我已经这样做了)。我只是不确定如何按学生编号在数组列表中搜索特定对象,以及如何打印数组列表。任何提示都很好,谢谢 迄今为止的代码: package student; public class Student { private String studentName; private String studentNo; private String email

我必须实现一个java应用程序来演示对象数组列表的使用。我使用学生,我有一个学生测试班。我应该能够输入详细信息(我已经这样做了)。我只是不确定如何按学生编号在数组列表中搜索特定对象,以及如何打印数组列表。任何提示都很好,谢谢

迄今为止的代码:

package student;

public class Student {

    private String studentName;
    private String studentNo;
    private String email;
    private int year;

    public Student() {
        this.studentName = null;
        this.studentNo = null;
        this.email = null;
        this.year = -1;
    }

    public Student(String nName, String nNum, String nEmail, int nYr) {
        this.studentName = nName;
        this.studentNo = nNum;
        this.email = nEmail;
        this.year = nYr;
    }

    public void setStudentName(String newStudentName) {
        this.studentName = newStudentName;
    }

    public void setStudentNo(String newStudentNo) {
        this.studentNo = newStudentNo;
    }

    public void setEmail(String newEmail) {
        this.email = newEmail;
    }

    public void setYear(int newYear) {
        this.year = newYear;
    }

    public String getStudentName() {
        return studentName;
    }

    public String getStudentNo() {
        return studentNo;
    }

    public String getEmail() {
        return email;
    }

    public int getYear() {
        return year;
    }

}
package student;

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

public class studentTest {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);


        List<Student> Students = new ArrayList();


        System.out.println("Enter number of students");
        int countStudents = input.nextInt();

        for (int i = 0; i < countStudents; i++) {
            Student student1 = new Student();
            System.out.println("Enter details for student: " + (i + 1));

            System.out.println("Enter name: ");
            student1.setStudentName(input.next());

            System.out.println("Enter Number: ");
            student1.setStudentNo(input.next());

            System.out.println("Enter email: ");
            student1.setEmail(input.next());

            System.out.println("Enter year: ");
            student1.setYear(input.nextInt());
            Students.add(student1);



        }
    }
}
package学生;
公立班学生{
私有字符串studentName;
私人弦乐学生号;
私人字符串电子邮件;
私人国际年;
公立学生(){
this.studentName=null;
this.studentNo=null;
this.email=null;
今年=-1;
}
公立学生(字符串nName、字符串nNum、字符串nEmail、int nYr){
this.studentName=nName;
this.studentNo=nNum;
this.email=nEmail;
本年=nYr;
}
public void setStudentName(字符串newStudentName){
this.studentName=newStudentName;
}
public void setStudentNo(字符串newStudentNo){
this.studentNo=newStudentNo;
}
public void setEmail(字符串newEmail){
this.email=newEmail;
}
公共无效设置年(整数新年){
今年=新年;
}
公共字符串getStudentName(){
返回学生姓名;
}
公共字符串getStudentNo(){
返回学生号;
}
公共字符串getEmail(){
回复邮件;
}
公共int getYear(){
回归年;
}
}
包装学生;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Scanner;
公开课学生测验{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(System.in);
List Students=new ArrayList();
System.out.println(“输入学生人数”);
int countStudents=input.nextInt();
for(int i=0;i
您需要在
学生
类中实现一个
equals()
方法,如果两个学生拥有相同的
学生编号
,则该方法将返回true,否则返回false

@Override
public boolean equals(Object ob) {

    if (!(ob instanceof Student)) { 
        return false;
    }

    return ob.getStudentNo().equals(this.getStudentNo());
}
现在,您可以使用
contains
方法检查
学生是否在
列表中

更新:-

此外,您需要重写
hashcode
方法,无论何时重写
等于
方法,以维护它们之间的一般契约。因此,重写
hashcode
,它将仅基于比较
对象的字段来计算
实例的
hashcode

因此,您需要使用
studentNo
计算
hashcode

@Override
public int hashcode() {
    return this.getStudentNo().hashCode(); 
}
  • HashCode计算算法应该是这样的,如果两个实例相等,它们的HashCode也应该相等
  • 它每次都应该为同一个实例返回相同的值,当然是在实例未被修改时
  • 两个不同的实例可以具有相同的哈希代码
正如@hyde在评论中所建议的那样:-

如果这对您来说太多了,那么您可以使用另一种方法,它执行与
equals
方法相同的任务,例如,
checkEquals()
ignore
重写
equals()
方法。但是在这种情况下,您必须在
列表上执行
迭代
,对于每个列表元素,调用
方法
,与
学生
进行比较

for(Student student: studentList) {
    if (student.checkEquals(myStudent)) {
        System.out.println("True");
    }
}

您需要在
Student
类中实现
equals()
方法,如果两个学生有相同的
studentNo
,则该方法将返回true,否则返回false

@Override
public boolean equals(Object ob) {

    if (!(ob instanceof Student)) { 
        return false;
    }

    return ob.getStudentNo().equals(this.getStudentNo());
}
现在,您可以使用
contains
方法检查
学生是否在
列表中

更新:-

此外,您需要重写
hashcode
方法,无论何时重写
等于
方法,以维护它们之间的一般契约。因此,重写
hashcode
,它将仅基于比较
对象的字段来计算
实例的
hashcode

因此,您需要使用
studentNo
计算
hashcode

@Override
public int hashcode() {
    return this.getStudentNo().hashCode(); 
}
  • HashCode计算算法应该是这样的,如果两个实例相等,它们的HashCode也应该相等
  • 它每次都应该为同一个实例返回相同的值,当然是在实例未被修改时
  • 两个不同的实例可以具有相同的哈希代码
正如@hyde在评论中所建议的那样:-

如果这对您来说太多了,那么您可以使用另一种方法,它执行与
equals
方法相同的任务,例如,
checkEquals()
ignore
重写
equals()
方法。但是在这种情况下,您必须在
列表上执行
迭代
,对于每个列表元素,调用
方法
,与
学生
进行比较

for(Student student: studentList) {
    if (student.checkEquals(myStudent)) {
        System.out.println("True");
    }
}

覆盖
equals
Student
的方法。覆盖
equals
Student
的方法。这更像是吹毛求疵,但在这方面