------- android培训、java培训、期待与您交流! ----------
这是张孝祥老师讲解的一道关于交通灯系统模拟的面试题。之前看到题目时不知所云,在连续看了几遍老师的讲解后,通过自己的一些理解模仿张老师的代码,敲出代码记录以供以后参考。
需求如下所述:
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
1.异步随机生成按照各个路线行驶的车辆。
例如:
由南向北的车辆 ---- 直行车辆
由南向东的车辆 ---- 右转车辆
由南向西的车辆 ---- 左转车辆
2.信号灯忽略黄灯,只考虑红灯和绿灯。
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
3.具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
经过分析整个交通系统分为三个对象进行代码解析:路、灯、灯控制器
并且路线经过分析总共有12条,起关键作用的只有四条
其次,路和车辆的关系是:路类中包含操作车辆集合的方法
首先,代码实现路类:classRoad
package cn.traffic.interviw;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
importjava.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
importjava.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.jws.soap.SOAPBinding.Use;
public class Road {
//首先需要将路进行命名,路一初始化就应该有路名
privateString name;
//路线初始化后随机向道路中添加车辆,所以需要一个车辆集合
List<String>vechicles=newArrayList<String>();
publicRoad(String name){
this.name=name;//对路线进行初始化
//通过创建线程池的方式随机向路线中添加车辆
ExecutorServicepool=Executors.newSingleThreadExecutor();
//线程执行添加车辆
pool.execute(newRunnable(){
publicvoid run(){
for(inti=0;i<4;i++){
try{
Thread.sleep((newRandom().nextInt(10)+1)*1000);
}catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println("开始在"+Road.this.name+"中添加第"+i+"辆车!!");
vechicles.add(Road.this.name+"Direction<---->NO."+i+" is driving!");
}
}
});
//制作定时器
ScheduledExecutorServicetimer=Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(newRunnable(){
publicvoid run(){
if(vechicles.size()>0){
booleanlighted=Lamp.valueOf(Road.this.name).isLighted();
if(lighted){
System.out.println(vechicles.remove(0));
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
}
其次,代码实现灯类:enumLamp
package cn.traffic.interviw;
public enum Lamp {
//通过分析十字路口存在12条路线供车辆使用,即对应12盏灯。。。通过枚举理出以下方向的灯
/*
车辆通过十字路口时主要考虑直行灯,左转灯分别有8条,并且是对立的;同时右转灯设定为常绿灯
所以综合起来只需要考虑四盏灯,直行两盏,左转弯两盏。
将十字路口分为SNEW四个方向,T电表To
则有以下12个方向的灯:
ETW,STN,STE,WTS,
WTE,NTS,NTW,ETN,
STW,WTN,NTE,ETS;
*/
ETW("WTE","STN",false),STN("NTS","STE",false),STE("NTW","WTS",false),WTS("ETN","ETW",false),
WTE(null,null,false),NTS(null,null,false),NTW(null,null,false),ETN(null,null,false),
STW(null,null,true),WTN(null,null,true),NTE(null,null,true),ETS(null,null,true);
private boolean lighted;
private String opposite;
private String next;
//首先需要对灯进行初始化
private Lamp(String opposite,String next,boolean lighted){//需要对对应的灯、下一个灯和灯的状态进行初始化
this.opposite=opposite;
this.next=next;
this.lighted=lighted;
}
//判断灯的状态
public boolean isLighted(){
return lighted;
}
//灯变绿
public void lightGreen(){
lighted=true;
if(opposite!=null){//如果有对应的灯,相应变绿
System.out.println(name()+"::"+opposite+" directionis Green,veches are Driving!-3");
Lamp.valueOf(opposite).lightGreen();
}
}
//灯变红
public Lamp lightRed(){
lighted=false;
if(opposite!=null){
Lamp.valueOf(opposite).lightRed();
System.out.println(name()+"::"+opposite+" directionis Red,veches are Parking!-1");
}
Lamp nextLamp=null;
if(next!=null){//灯变红后相应的有下一个灯变绿
nextLamp=Lamp.valueOf(next);
System.out.println(next+" directionbeginto Green,veches are readyfor Driving!-2");
nextLamp.lightGreen();
}
return nextLamp;//灯变红后,相应的返回下一盏灯即将变绿
}
}
接着,代码实现灯控制器:class LampController
package cn.traffic.interviw;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class LampController {//灯的控制器,控制灯的状态
//因为要对灯的状态进行控制,所以需要设定一盏当前灯
private Lamp currentLamp;
//对当前灯进行初始化,设定一开始该灯就是绿色的
public LampController(){
currentLamp=Lamp.ETW;
currentLamp.lightGreen();
//设置一个定时器,隔一段时间进行灯状态的切换
ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable(){
public void run() {
//等开始变红,变红后返回下一个灯为当前灯变绿
currentLamp=currentLamp.lightRed();
}
},
4,
6,
TimeUnit.SECONDS);
}
}
最后,代码实现主函数:class MainRun
package cn.traffic.interviw;
public class MainRun {
public static void main(String[]args){
//首先需要创建12条路线,将路线名传入Road类中对路线进行初始化
String[]roads=new String[]{
"ETW","STN","STE","WTS",
"WTE","NTS","NTW","ETN",
"STW","WTN","NTE","ETS"
};
for(int i=0;i<roads.length;i++){
new Road(roads[i]);
}
//创建灯控制器,控制灯的状态
new LampController();
}
}
通过对张老师代码的模仿,基本上掌握了交通灯系统代码的书写。同时也掌握了部分做项目的心得,但是对Java面向对象编程的概念掌握还是不是很熟练,需要进一步加强学习。。。