面试题-交通灯

来源:互联网 发布:王者荣耀优化安卓7.0 编辑:程序博客网 时间:2024/06/08 10:51

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

                                 面试题-交通灯
一,
面向对象设计把握一个重要的经验:谁拥数据,谁就对外提供操作这些数据的方法
二,jdk1.5的线程建立 方法:
Executors(工具类位于java.util.current包中)   中的静态方法newSingleThreadExceutor()会返回一个ExecutorService对象线程池 
ExecutorService对象中有一个execute(线程对象)方法    

定时器:
Executors.newScheduledThreadPool(1);会返回一个ScheduledExecutorService对象中有一个方法:scheduleAtFixedRate(Runnable对象,过多长时间去执行,
过多少秒再去做,时间单位(TimeUnit));    

三,题目要求:
异步随机生成按照各个路线行驶的车辆。
例如:
       由南向而来去往北向的车辆 ---- 直行车辆
       由西向而来去往南向的车辆 ---- 右转车辆
       由东向而来去往南向的车辆 ---- 左转车辆
       。。。
 
信号灯忽略黄灯,只考虑红灯和绿灯。
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
 
思路分析:


很明显的可以从题目中得知需要要灯,控制系统这个类,但是还要模拟车辆行驶的过程,这时我们就要考虑是还有一个关于车的类,还是要有一个路类
车怎么行驶是车内部的事,但是当车遇到红灯时就要消失,但是这不是车可以完成的事,所以说,当灯变红时,是路将此车移除了。所以这首题需要四个类
灯,路,控制灯的类,,,还有就运行的类。

灯类:假设我们现在只考虑由南向北车行驶的情况,,这时会有三种情况:第一种车由南向北直行,第二种情况:车要左转,第三种情况:车要右转,
所以当车由南向北行驶时需要3个灯来控制,而由北向南行驶和由南向北行驶的情况一样,也需要3个灯来控制,并且,直行时都要直行,左转时都要
左转。所以这时我们可以使用两个灯来控制直行,左转的状态,右转不受信号控制也就是说总是绿的。南北走向的车要两个灯来控制,同理东西走向
的车也要两个灯来控制,其实这样下来一共是十二个灯,其中四个灯为右转,也就是它们的状态为绿灯,而剩下的八个灯又是两个两个的相对。
并且当一对直行的灯变红后,它会返回下一组,并将其变绿。而这十二个又是固定不会变的,我可以使用枚举来设计这十二个灯。并且,它们的
状态,所对的灯,返回的下一个灯也是一建立就会有的,可以将它们通过构造函数来进行传递。灯内部也有一些自己的方法,判断自己的状态,
将自己变红,将自己变绿。
路类:因为有十二个灯,所以它们会对应十二条路,而每条路上都会随机的出现车并通过,我们可以使用集合来完成此功能。我们根据灯的名字来建立路
的实例对象,然后根据灯的名字获取到此灯的状态,如果为真,我就会从集合中移除一个元素,还要设计一个定时器来循环判断灯的状态。
控制器:使用定时器来完成灯的转换。
运行类:建立十二条路,并且将十二个灯名字依次传入,进行状态的判断。
代码如下:
-------------------------------------------------------------------------------------------------------------
package traffic;
/*
 * 灯类
 
 * 交通灯,一共有12 个类其中每个灯是相对,如果由南向北的灯和由北向南的灯是相对的。还有四个左转的灯是常绿的,所以就只
 * 剩下八个灯了,而这个八个灯中的,又是两两相对的,所以需要控制四个灯就可以了,所以我们可心在构造时将其对面的灯一起传入,
 * 然而这个灯在变红时,也会返回下一个灯,所以我们也可心将这个灯的下一个灯也做为参数进行传递,还有就是每个灯都是有自己的
 * 自属性信息的,
 * */


public enum Lamp {

//定义十二个灯
S2N(false,"S2W","N2S"),S2W(false,"E2W","N2E"),E2W(false,"E2S","W2E"),E2S(false,"S2N","W2N"),
N2S(false,null,null),N2E(false,null,null),W2E(false,null,null),W2N(false,null,null),
S2E(true,null,null),E2N(true,null,null),N2W(true,null,null),W2S(true,null,null);
//每个元素都 有一个自己的状态 , 和所对的灯,还有下一个灯
private boolean lampStatus;
private String nextLamp;
private String oppostionLamp;
//构造函数 
private Lamp(boolean lampStatus, String nextLamp, String oppostionLamp) {
this.lampStatus = lampStatus;
this.nextLamp = nextLamp;
this.oppostionLamp = oppostionLamp;
}
//这个灯还有有一个判断自己状态的方法
public boolean isRight(){
return lampStatus;
}
//一个可心使自己,对面的灯变亮的方法
public void right(){
//将自己的类变亮, 
this.lampStatus = true;
//将对面的灯也变亮
if(oppostionLamp != null){
Lamp.valueOf(oppostionLamp).right();}
System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");

}
//一个可以变红的方法,并返回下一个灯
public Lamp black(){
//将自己变红
this.lampStatus = false;
//将对面的灯变红
if(oppostionLamp != null)
Lamp.valueOf(oppostionLamp).black();
// 返回下一个灯对象
Lamp lampNext = null;
if(nextLamp != null){
lampNext = Lamp.valueOf(nextLamp);
System.out.println("绿灯从" + name() + "-------->切换为" + lampNext);
//将下一个灯变亮
lampNext.right();
}
return lampNext;
}

}
--------------------------------------------------------------------------------------------
package traffic;


import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;


/*
 * 这是一个路的类,是一个集合,每个灯对应一条路,每条路上有一个集合,集合里装有100个元素,,并且每个元素添加时要休息一会
 * */
public class RoadClass {
//记录一个路的名字
private String roadName;

private List<String> list = new ArrayList<String>();
//在构造函数上建立集合0
public RoadClass(String roadName){
this.roadName = roadName;
//使用一个线程来完成元素的添加 ,在添加 时要休息一会,
Executors.newSingleThreadExecutor().execute(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
//给集合中添加 元素
for(int x=1; x<100; x++){
try{
Thread.sleep((new Random().nextInt(10)+1)*1000);
// System.out.println("sleep...");
}
catch(Exception e){
e.printStackTrace();
}
list.add(RoadClass.this.roadName+"第"+x+"辆车开始行驶!");
}
}
});
//来一个定时器,定时将车辆移走
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){
public void run(){
//对集合长度进行判断 ,如果长度大于零的话,还要判断一下此路名所对的灯状态是否为可以执行的,,这样才可以移除元素
if(list.size() >0)
if(Lamp.valueOf(RoadClass.this.roadName).isRight())
System.out.println(list.remove(0));
}
}, 1, 1, TimeUnit.SECONDS);
}
}
----------------------------------------------------------------------------------------------------
package traffic;


import java.util.concurrent.Executors;
/*
 * 控制交通灯的变化 ,,需要用到定时器
 * */
import java.util.concurrent.TimeUnit;


public class TrafficControl {

//在启动时要有一个默认的灯,
private Lamp lamp ;
//将此类变亮
public TrafficControl(){
lamp = Lamp.S2N;
lamp.right();
// System.out.println("imde imde ");
//设计定时 器,定时 将转变灯的状态 
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){
public void run(){
//过10秒后将这个默认的灯变红,变红后会自动返回下一个灯,使用全局变量来记录住这个灯
lamp = lamp.black();
System.out.println("TrafficControl");
}

}, 10, 10, TimeUnit.SECONDS);
}

}
---------------------------------------------------------------------------------------------------
package traffic;
/*
 * 运行类
 * 
 * */


public class MainClass {


public static void main(String[] args){
//建立一个装有十二条名字的数组
String[] roadNames = {"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
//循环建立十二条路
for(int x=0; x<roadNames.length; x++){
//建立路的对象被将此路的名字传入与此对应灯相关联
new RoadClass(roadNames[x]);
}
//建立一个控制器对象
new TrafficControl();
}
}



                        

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
0 0
原创粉丝点击