Java: 如何根据特定属性从队列中删除对象?

Java: How to delete an object from a queue based an a particular attribute?

我必须编写一个程序来模拟一个队列,在这个队列中,去图书馆的学生会得到一个令牌,并被要求在一个逻辑队列中等待轮到他们。令牌号是自动生成的。

该程序应显示一个菜单,允许用户随时:

  1. 在队列中插入一个新学生。

  2. 查看名称和令牌号。排在前面的学生的画像。

  3. 从队列中删除一名学生。

  4. 找出队列中有多少学生。

应该还有退出程序的选项。

我已经能够实施选项 1、2 和 4。由于没有提到应该如何删除学生,我想删除是通过输入学生姓名来完成的或令牌号,但我不知道该怎么做。

这是我到目前为止所做的:

Student.java Class

 package queues;

import java.util.Random;

public class Student {

  private String name;

  private int  tnum;

public Student(String name, int tnum){
    this.name=name;
    this.tnum=tnum;
}

public String getName() {
    return name;
}


public void setName(String name) {
    this.name = name;
}


public int getTnum() {
    return tnum;
}


public void setTnum(int tnum) {
    this.tnum = tnum;
}


public String toString(){
    return "Student name: "+ name+ "  Token num: "+tnum;
   }

 }

Student_Main.java Class

  package queues;

  import java.util.LinkedList;
  import java.util.Queue;
  import java.util.Scanner;

public class Student_Main{


    public static void main(String[] args) {

    Scanner sc= new Scanner(System.in);

    int opt;
    int tno;

    Student stdt= new Student("Sophia", 1);
    Student stdt2= new Student("Amelia", 2);
    Student stdt3= new Student("Karxlina", 4);
    Student stdt4= new Student("Rachel", 3);

    Queue<Student> stdtQ= new LinkedList<Student>();

    stdtQ.add(stdt);
    stdtQ.add(stdt2);
    stdtQ.add(stdt3);
    stdtQ.add(stdt4);

    System.out.println(stdtQ);

    while(true){

    System.out.println("Please choose an option. ");
    System.out.println();
    System.out.println("To insert new student, enter 1.");
    System.out.println();
    System.out.println("To view the name and token number of a student in front, enter 2.");
    System.out.println();
    System.out.println("To delete a student, enter 3.");
    System.out.println();
    System.out.println("To find out the number of students, enter 4.");
    System.out.println();
    System.out.println("To exit the system, enter 5.");

    opt= sc.nextInt();


    if(opt==1){
        System.out.println("Enter student's name and token number.");
        stdtQ.add(new Student(sc.next(), sc.nextInt()));

        System.out.println("New queue: ");
        System.out.println(stdtQ);
    }



    if(opt==2){
        System.out.println(stdtQ.peek());
    }

    if(opt==3){

    }

    if(opt==4){
        System.out.println("Number of students in the queue is: "+ stdtQ.size());
        System.out.println(stdtQ);
      }

    if(opt==5){
        System.exit(0);
            }


       }

    }
 }

如果您希望从队列中按编号删除学生(假设每个学生的编号都是唯一的),那么您需要在学生对象中实现 equals 方法,例如:

public boolean equals(Object student) {
     ....
     return this.tNum.equals(student.getTnum());
}

如果你想按编号删除学生,你可以这样做:

if(opt==3){
      //read number
      ((Collection)stdtQ).remove(new Student("", number));
}
if(opt==3){             
    System.out.println("Enter token num to delete");
    int to_num = sc.nextInt();
    Iterator<Student> itr = stdtQ.iterator();  

    while(itr.hasNext()){  
        Student obj = itr.next();
        if( obj.getTnum() == to_num)
        {
            stdtQ.remove(obj);
            break;
        }
    }       
 }