Java: 如何根据特定属性从队列中删除对象?
Java: How to delete an object from a queue based an a particular attribute?
我必须编写一个程序来模拟一个队列,在这个队列中,去图书馆的学生会得到一个令牌,并被要求在一个逻辑队列中等待轮到他们。令牌号是自动生成的。
该程序应显示一个菜单,允许用户随时:
在队列中插入一个新学生。
查看名称和令牌号。排在前面的学生的画像。
从队列中删除一名学生。
找出队列中有多少学生。
应该还有退出程序的选项。
我已经能够实施选项 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;
}
}
}
我必须编写一个程序来模拟一个队列,在这个队列中,去图书馆的学生会得到一个令牌,并被要求在一个逻辑队列中等待轮到他们。令牌号是自动生成的。
该程序应显示一个菜单,允许用户随时:
在队列中插入一个新学生。
查看名称和令牌号。排在前面的学生的画像。
从队列中删除一名学生。
找出队列中有多少学生。
应该还有退出程序的选项。
我已经能够实施选项 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;
}
}
}