1.问题
设计一个排队系统,能够让每个进入队的用户都能看到自己在队列中所处的位置和变化。队列可能随时有人加入和退出,当有人退出时影响到用户的位置需要及时的反馈到用户。
2.问题分析:
不仅要实现队列常见的入队和出队的功能,还要实现队列中任意元素可以随时出队,并且出队列后需要更新队里用户位置的变化。
3 代码实现
package Queue;
import java.util.LinkedList;
import java.util.Objects;
import java.util.Queue;
public class MyQueue {
private Queue<User> q=new LinkedList<User>();
//进队
void enQueue(User u){
q.add(u);//队列尾增加一个人
u.setSep(q.size()+1);//定位新增加用户在队列中的id
}
//对首元素出队
void deQueue(){
q.poll();
updateSeq();
}
//队列中随机出队
void deQueue(User u){
q.remove(u);
updateSeq();
}
//出队后更新队列中每个人的序列
void updateSeq(){
int i=1;
for (User u:q){
u.setSep(i++);
}
}
//打印队列的信息
void printList(){
for (User u:q){
System.out.println(u);
}
}
public static void main(String[] args) {
User u1=new User(1,"user1");
User u2=new User(2,"user2");
User u3=new User(3,"user3");
User u4=new User(4,"user4");
User u5=new User(5,"user5");
MyQueue queue=new MyQueue();
queue.enQueue(u1);
queue.enQueue(u2);
queue.enQueue(u3);
queue.enQueue(u4);
queue.enQueue(u5);
queue.deQueue();//队首出队
queue.deQueue(u4);//u4出队
queue.printList();
}
}
class User{
private int id;//成员变量 ,唯一标识符id
private String name;
private int sep;//表示每各人的排队的位置
public User(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSep() {
return sep;
}
public void setSep(int sep) {
this.sep = sep;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id == user.id;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", sep=" + sep +
'}';
}
}