import java.awt.Graphics;
public class Bank extends VisibleObject {
private long count = 0;//总客户数目
private long totaltime =0;//客户总逗留时间
private int windowNum =1;//窗口数目
private Window[] windows =null;//窗口
private Events events = new Events();//离散事件
private long opentime = 0; //银行开门时间
private long closetime = 120; //银行营业总时间,单位分钟
private Event currentEvent = null;
private Customer currentCustomer = null;
public Bank(int windowNum){
//初始化
count = 1;
totaltime =0;
//生成窗口
this.windowNum = windowNum;
windows = new Window[this.windowNum];
for(int i=0;i<windowNum;i++){
windows[i] = new Window("窗口"+(i+1));
}
//事件表清空
events.clear();
//生成一个客户到达事件
Customer customer = new Customer("A"+String.valueOf(count),opentime + 0);
Event ev = new Event(Event.EventType.arrival,customer);
events.put(ev.getOccurTime(), ev);
}
public void Run(){
while(events.size()>0){
Do();
}
}
public void Do(){
if(events.size()>0){
//取得时间上最早发生的事件
String firstKey = events.firstKey();
System.out.println("Current event:"+firstKey);
//当前事件和当前客户
currentEvent = (Event)events.get(firstKey);
currentCustomer = currentEvent.getCustomer();
//当前事件是客户到达事件的时候
if(currentEvent.getEventType().equals(Event.EventType.arrival)){
System.out.println(String.format("At Time:%s Customer:%s arrived!", currentCustomer.getArrivaltime(),currentCustomer.getName()));
long durtime = getRandomInt(8,15); //随机产生的办理业务时间
long interval = getRandomInt(1,2); //下一个客户进入银行的时间
currentCustomer.setDurTime(durtime);//设置当前客户的办理业务时间
//如果下一个客户到达的时间是在银行关门时间之前,那么生成一个客户到达事件
if(currentCustomer.getArrivaltime() + interval < closetime){
count++;
Customer customer = new Customer("A"+String.valueOf(count),currentCustomer.getArrivaltime() + interval);
Event ev = new Event(Event.EventType.arrival,customer);
events.put(ev.getOccurTime(), ev);
}
//查找人数最少的窗口,当前客户在该窗口排队
int min = getWindow4Minimal();
currentCustomer.setWindow(min);
windows[min].add(currentCustomer);
//当前客户所在的窗口的客户就是当前客户,那么确定当前客户的离开时间,并且生成客户离开事件
Customer head = (Customer)windows[min].get(0);
if(head!=null && head.equals(currentCustomer)){
currentCustomer.setLefttime(currentCustomer.getArrivaltime() + durtime);
Event ev = new Event(Event.EventType.left,currentCustomer);
events.put(ev.getOccurTime(), ev);
}
}else{//当前事件是客户离开事件的时候
System.out.println(String.format("At Time:%s, Transatcion Time %s Customer:%s left!", currentCustomer.getLefttime(),currentCustomer.getDurTime(),currentCustomer.getName()));
//计算逗留事件
totaltime+=currentCustomer.getTotalTime();
//当前客户离开他所在的窗口
int currentWindow = currentCustomer.getWindow();
windows[currentWindow].remove(currentCustomer);
//当前客户所在的窗口内还有客户的话,那么确定该窗口得第一个排队客户的离开时间,并且生成该客户离开事件
if(windows[currentWindow].size()>0){
Customer nextCustomer = (Customer)windows[currentWindow].get(0);
if(nextCustomer!=null){
nextCustomer.setLefttime(currentCustomer.getLefttime() + nextCustomer.getDurTime());
Event ev = new Event(Event.EventType.left,nextCustomer);
events.put(ev.getOccurTime(), ev);
}
}
}
//当前事件从事件表中删除
events.remove(firstKey);
}
}
private int getWindow4Minimal(){
int j=0;
int number = windows[0].size();
for(int i=1;i<this.windowNum;i++){
if(number>windows[i].size()){
number = windows[i].size();
j = i;
}
}
return j;
}
private int getRandomInt(int from, int to){
int random = from;
while(true){
double value =java.lang.Math.random()*(to+1);
random =(int)value;
if(random>=from){
return random;
}
}
}
public long getCount() {
return count;
}
public long getTotaltime() {
return totaltime;
}
public int getWindowNum() {
return windowNum;
}
public Window[] getWindows() {
return windows;
}
private Event getCurrentEvent() {
return currentEvent;
}
public void paint(Graphics g){
Event currentEvent = this.getCurrentEvent();
Customer currentCustomer = currentEvent.getCustomer();
if(currentEvent!=null){
if(currentEvent.getEventType().equals(Event.EventType.arrival)){
g.drawString(String.format("At Time:%s Customer:%s arrived!", currentCustomer.getArrivaltime(),currentCustomer.getName()),20,80);
}else{
g.drawString(String.format("At Time:%s, Transatcion Time %s Customer:%s left!", currentCustomer.getLefttime(),currentCustomer.getDurTime(),currentCustomer.getName()),20,80);
}
}
g.drawLine(20, 100, this.getWidth()-20, 100);
Window[] windows = this.getWindows();
for(int i=0;i<this.getWindowNum();i++){
windows[i].setX(20);
windows[i].setY(150+i*150);
windows[i].paint(g);
}
g.drawLine(20, this.getHeight()-50, this.getWidth()-20, this.getHeight()-50);
g.drawString(String.format("Total Time:%s, Total Customers number:%s!", this.getTotaltime(),this.getCount()),this.getWidth()-300,this.getHeight()-30);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
用java模拟银行柜台排队
共19个文件
class:9个
java:7个
classpath:1个
3星 · 超过75%的资源 需积分: 45 62 下载量 9 浏览量
2013-12-06
11:35:45
上传
评论 1
收藏 16KB RAR 举报
温馨提示
4年前在办理银行业务的时候,看到每个办理柜台窗口前都有很多人排队。 同时在那个时间段,我正好重温了数据结构这本书。好像里面有提到银行。 所以当时就用java写了一段小程序来模拟窗口排队的情况。 有兴趣的朋友,看看下载下来看看。 我觉得可以利用这个程序可以帮助银行设立多少个柜台窗口,就能满足日常办理柜台业务的需求了。
资源推荐
资源详情
资源评论
收起资源包目录
Bank.rar (19个子文件)
Bank
.project 516B
Events.java 1002B
VisibleObject.class 1KB
Bank.java 6KB
BankFrame.class 2KB
Event.class 2KB
Events.class 2KB
.settings
org.eclipse.core.resources.prefs 89B
BankFrame$MyWindowAdapter.class 736B
Event.java 907B
Bank.class 5KB
Window.java 1KB
Customer.java 1KB
Window.class 2KB
VisibleObject.java 851B
Customer.class 2KB
.classpath 226B
Event$EventType.class 986B
BankFrame.java 1KB
共 19 条
- 1
资源评论
- lancarmine2017-11-28没有排队机制??
- 安逸的困惑2017-05-14谢谢分享,不过里面没有排队机制
郭永荣
- 粉丝: 3
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功