用Java模拟银行排队场景

前言:该场景是模拟银行排队,其中窗口有3个,而且每个用户有不同的处理时间。
代码如下:

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

public class BankQueue {

    private static final int WINDOW_NUM = 3; // 窗口数量
    private static final int CUSTOMER_NUM = 10; // 客户数量
    private static final int[] SERVICE_TIME = { 3, 5, 2, 4, 1, 6, 2, 4, 2, 3 }; // 不同客户的处理时间

    public static void main(String[] args) {
        Queue<Customer> queue = new LinkedList<>(); // 队列
        for (int i = 0; i < CUSTOMER_NUM; i++) {
            Customer customer = new Customer(i + 1, SERVICE_TIME[i]); // 创建客户
            queue.offer(customer); // 将客户加入队列
        }

        int time = 0; // 当前时间
        int[] window = new int[WINDOW_NUM]; // 窗口剩余处理时间
        System.out.println("开始银行排队场景模拟:");
        while (!queue.isEmpty() || isWindowBusy(window)) {
            time++;
            for (int i = 0; i < WINDOW_NUM; i++) {
                if (window[i] == 0 && !queue.isEmpty()) { // 窗口空闲且队列不为空
                    Customer customer = queue.poll(); // 取出队首客户
                    System.out.println("第" + customer.getId() + "号客户开始在第" + (i + 1) + "号窗口处理业务,处理时间为" + customer.getServiceTime());
                    window[i] = customer.getServiceTime(); // 窗口开始处理客户业务
                }
                if (window[i] > 0) { // 窗口正在处理客户业务
                    window[i]--;
                }
            }
        }
        System.out.println("银行排队场景模拟结束,共用时" + time + "秒。");
    }

    private static boolean isWindowBusy(int[] window) {
        for (int w : window) {
            if (w > 0) {
                return true;
            }
        }
        return false;
    }

    static class Customer {
        private int id;                // 客户编号
        private int serviceTime;    // 客户需要处理的时间

        public Customer(int id, int serviceTime) {
            this.id = id;
            this.serviceTime = serviceTime;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public int getServiceTime() {
            return serviceTime;
        }

        public void setServiceTime(int serviceTime) {
            this.serviceTime = serviceTime;
        }
    }
}

代码能够模拟银行排队场景,实现了以下功能:

创建多个不同处理时间的客户,并加入队列。
模拟多个窗口同时服务,按照队列顺序分配给空闲窗口,计算每个客户服务时间,返回全局最长时间(即所有客户都被服务完毕所需的时间)。
输出每个客户处理情况。
注意事项:本代码没有考虑客户是否能够等待的问题,即如果等候太久(超过自己的业务开展时间),应该退出队列,所以在实际场景中需要完善。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值