[英]How can I remove items from arrayList by StudentID?
我需要编写一种通过学生ID从ArrayList(myRoster)中删除学生的方法。 如果学生证不存在,则该方法应打印一条错误消息,指出找不到该学生证。 我写了一个remove方法,可以按索引删除项目。 错误消息“未找到ID为3的学生”返回6次(第一次删除3次,第二次错误3次)。 但是我想在主方法中调用第二个remove方法时收到一条错误消息。 一点帮助将不胜感激。
学生班
public class Student {
private int StudentID;
private String FirstName;
private String LastName;
private String Email;
private int age;
private int[] Grades;
//Constructor
public Student(int S_ID,String fName,String lName,String email,int Age,
int[] grade){
setStudentID(S_ID);
setFirstName(fName);
setLastName(lName);
setEmail(email);
setAge(Age);
setGrade(grade);
}
//Accessor Methods (get methods)
public int getStudentID(){
return StudentID;
}
public String getFirstName(){
return FirstName;
}
public String getLastName(){
return LastName;
}
public String getEmail(){
return Email;
}
public int getAge(){
return age;
}
public int[] getGrades(){
return Grades;
}
//Mutator methods (set methods)
public void setStudentID(int StudentID){
this.StudentID=StudentID;
}
public void setFirstName(String FirstName){
this.FirstName=FirstName;
}
public void setLastName(String LastName){
this.LastName=LastName;
}
public void setEmail(String Email){
this.Email=Email;
}
public void setAge(int age){
this.age=age;
}
public void setGrade(int Grade[]){
this.Grades=Grade;
}
}
名册类
import java.util.ArrayList;
public class Roster {
private static ArrayList<Student> myRoster= new ArrayList<>();
public static void main(String[] args) {
add(1,"John", "Smith", "John1989@gmail.com", 20, 88,79, 59);
add(2,"Suzan", "Erickson", "Erickson_1990@gmailcom",19,91,72,85);
add(3,"Jack","Napoli","The_lawyer99yahoo.com",19,85,84,87);
add(4,"Erin", "Black","Erin.black@comcast.net",22,91,98,82 );
add(5,"Henry","Adam","adam1@gmail.com",25,85,84,79);
remove(3);
remove(3);//expected: This should print a message saying such a student with this ID was not found
}
public static void add(int S_ID,String fName,String lName,String email,int
Age, int grade1, int grade2, int grade3){
int[] Grades={grade1, grade2,grade3};
Student newStudent= new Student(S_ID, fName, lName, email, Age, Grades);
myRoster.add(newStudent);
}
public static void remove(int StudentID){
for (int i = 0; i < myRoster.size(); i++){
if(i == StudentID){
myRoster.remove(i);
}else{
System.out.println("Student with ID "+StudentID+" was not found");
}
}
}
}
}
i
与参数StudentID
比较,而应该是if(myRoster.get(i).getStudentID == StudentID)
。 为什么多次将文本“未找到ID为“ + StudentID +”的学生”的文本打印到控制台的原因是,您已将其插入循环中,这意味着每次参数StudentID
不匹配该值时与之比较时,它将打印相同的消息...
要完成任务,您可以简单地使用ArrayList#removeIf
方法删除具有指定StudentID
的Student
,否则,如果ArrayList#removeIf
返回false,则可以打印相应的消息,如下面的解决方案所示。
public static void remove(int StudentID) {
if (!myRoster.removeIf(s -> s.getStudentId() == StudentID))
System.out.println("Student with ID " + StudentID + " was not found");
}
您的问题似乎是您在remove()方法中的循环不是在学生ID上循环,而是在循环索引上。 您应该遍历studentID。 每当ID与给定的ID不匹配时,您的代码就会打印出来。 这就是为什么您会收到多条打印消息的原因。 您应该只在没有人匹配时打印(即名册大小不变)。
public static void remove(int StudentID){
int initialSize = myRoster.size(); //store initial size of roster to check if it changes
for (int i=0;i<myRoster.size();i++){
if(myRoster.get(i).getStudentID == StudentID){
myRoster.remove(i);
}
}
//checks if a student was removed which means the ID was found.
if(initialSize == myRoster.size()){
System.out.println("Student with ID "+StudentID+" was not found");
}
}
您也可以将Iterator界面用于您的目的,如下所示。
public static void remove(int StudentID) {
Iterator<Student> it = myRoster.iterator();
while(it.hasNext()) {
Student stud = (Student)it.next();
if (stud.getStudentID() == StudentID) {
it.remove();
return;
}
}
System.out.println("Student with ID " + StudentID + " was not found");
}
您的remove方法当前为列表中每个没有所需学生ID的学生给出一次错误消息。
for (int i=0;i<myRoster.size();i++){
if(i==StudentID){
myRoster.remove(i);
}else{
System.out.println("Student with ID "+StudentID+" was not found"); }
每当索引i
的学生没有所需的ID时,即在没有学生具有该ID的情况下,都将调用该打印语句。 解决此问题的一种简单方法是在方法的开头放置一个boolean
并将其设置为false。 然后,在if (i == StudentID)
块中,删除学生并将其值设置为true。 然后,在循环完成之后,检查布尔值是否为true;否则为false。 如果是真的,则所需的学生已被删除。 如果仍然为假,则没有学生具有所需的ID。
它看起来应该像这样:
public static void remove(int studentID) {
boolean studentFound = false;
for (int i=0;i<myRoster.size();i++){
if(i==StudentID){
myRoster.remove(i);
i--; // you have to decrement this value to account for the missing item
studentFound = true; // student with desired ID is removed
}
if (!studentFound) System.out.println("Student with ID "+StudentID+" was not found");
}
是的,您可以这样做,请在学生班上添加一些内容
public class Student {
private int StudentID;
private String FirstName;
private String LastName;
private String Email;
private int age;
private int[] Grades;
public Student(int S_ID ){
this.setStudentID(S_ID);
}
//Constructor
public Student(int S_ID,String fName,String lName,String email,int Age,
int[] grade){
setStudentID(S_ID);
setFirstName(fName);
setLastName(lName);
setEmail(email);
setAge(Age);
setGrade(grade);
}
//Accessor Methods (get methods)
public int getStudentID(){
return StudentID;
}
public String getFirstName(){
return FirstName;
}
public String getLastName(){
return LastName;
}
public String getEmail(){
return Email;
}
public int getAge(){
return age;
}
public int[] getGrades(){
return Grades;
}
//Mutator methods (set methods)
public void setStudentID(int StudentID){
this.StudentID=StudentID;
}
public void setFirstName(String FirstName){
this.FirstName=FirstName;
}
public void setLastName(String LastName){
this.LastName=LastName;
}
public void setEmail(String Email){
this.Email=Email;
}
public void setAge(int age){
this.age=age;
}
public void setGrade(int Grade[]){
this.Grades=Grade;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return StudentID == student.StudentID;
}
@Override
public int hashCode() {
return StudentID;
}
}
在主要的区域课程中,您可以
public class Test {
public static void main(String []args){
List<Student> list = new ArrayList<>();
list.add(new Student(1,"a","a","a",1, new int[]{1}));
list.add(new Student(2,"b","b","b",2, new int[]{2}));
list.remove(new Student(1));
list.forEach(System.out::println);
}
}
产量
com.traveliko.platform.web.frontend.Student@2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.