Java算法系列4 — 用队列实现简单用户排序系统

如何实现一个用户排序系统?

对于这样一道题,我们首先应该在脑海里联想到食堂排队等生活中的场景,它的一个特性就是先排队的同学在前面,后来的同学接在队伍后面往下排,如果前面第一个同学在双手颤抖的食堂阿姨那里打完饭菜,那么他将离开队伍,后面排队的同学依次往前挪一步(当然不允许插队啦!)

可以看出这个排队的场景跟我们数据结构里的队列(先进先出)非常像,所以我们首先应该决定用队列来实现。
当然,我们也要考虑到队列中,有同学不想等了直接离开的情况,这种情况下,该同学后面的所有同学应该往前挪一位。

接下来我们来代码实现:
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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值