如何实现一个用户排序系统?
对于这样一道题,我们首先应该在脑海里联想到食堂排队等生活中的场景,它的一个特性就是先排队的同学在前面,后来的同学接在队伍后面往下排,如果前面第一个同学在双手颤抖的食堂阿姨那里打完饭菜,那么他将离开队伍,后面排队的同学依次往前挪一步(当然不允许插队啦!)
可以看出这个排队的场景跟我们数据结构里的队列(先进先出)非常像,所以我们首先应该决定用队列来实现。
当然,我们也要考虑到队列中,有同学不想等了直接离开的情况,这种情况下,该同学后面的所有同学应该往前挪一位。
接下来我们来代码实现:
1、新建一个用户类(id、name、序列号)
import java.util.Objects;
/**
* 用户信息
*/
public class User {
private int id;
private String name;
private int seq;
public User(int id,String name){
this.id = id;
this.name = name;
this.seq = 0;
}
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 getSeq() {
return seq;
}
public void setSeq(int seq) {
this.seq = seq;
}
@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 &&
seq == user.seq &&
Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name, seq);
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", seq=" + seq +
'}';
}
}
2、排序方法
import java.util.LinkedList;
import java.util.Queue;
/**
* 用户排序系统
*/
public class UserQueue {
private Queue<User> q = new LinkedList<User>();
//进入队列尾部
public void enQueue(User u){
u.setSeq(q.size()+1);
q.add(u);
}
//排头出队列
public void deQueue(){
q.poll();
updateSeq();
}
//排头出队列后更新队列中每个人的序列
void updateSeq(){
int i = 1;
for(User u:q){
u.setSeq(i++);
}
}
//队列中的人随机离开
void deQueue(User u){
q.remove(u);
updateSeq();
}
//打印队列的信息
void printList(){
for(User u:q){
System.out.println(u);
}
}
}
3、测试类
public class Test {
public static void main(String[] args) {
User user1 = new User(1, "张三");
User user2 = new User(2, "李四");
User user3 = new User(3, "王五");
User user4 = new User(4, "赵六");
User user5 = new User(5, "陈七");
UserQueue userQueue = new UserQueue();
//入队
userQueue.enQueue(user1);
userQueue.enQueue(user2);
userQueue.enQueue(user3);
userQueue.enQueue(user4);
userQueue.enQueue(user5);
//此时排队情况
userQueue.printList();
System.out.println("---------");
//队首张三办完了离开
userQueue.deQueue();
//队尾陈七等不及了离开
userQueue.deQueue(user5);
//此时排队情况
userQueue.printList();
}
}