簡體   English   中英

如何通過StudentID從arrayList中刪除項目?

[英]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");
              }
          }
    }


    }

}
  1. 在迭代列表時, 切勿嘗試從列表中刪除元素。
  2. 您的比較不正確,原因是您正在將for循環控制變量i與參數StudentID比較,而應該是if(myRoster.get(i).getStudentID == StudentID)

為什么多次將文本“未找到ID為“ + StudentID +”的學生”的文本打印到控制台的原因是,您已將其插入循環中,這意味着每次參數StudentID不匹配該值時與之比較時,它將打印相同的消息...


要完成任務,您可以簡單地使用ArrayList#removeIf方法刪除具有指定StudentIDStudent ,否則,如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM