Java 在数组列表中搜索特定对象并打印数组列表中的所有对象
我必须实现一个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
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
的方法。这更像是吹毛求疵,但在这方面