7K面试题,交通灯管理系统

来源:互联网 发布:深度卷积网络怎么用 编辑:程序博客网 时间:2024/05/20 02:22


/*交通灯管理系统模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:?异步随机生成按照各个路线行驶的车辆。例如:       由南向而来去往北向的车辆 ---- 直行车辆       由西向而来去往南向的车辆 ---- 右转车辆       由东向而来去往南向的车辆 ---- 左转车辆       。。。?信号灯忽略黄灯,只考虑红灯和绿灯。?应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。?具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。?每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。?随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。?不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。*/
/*学习要用最短的时间学会一样的内容。由名字dom4j,得到方向的名字。W2E,通过画图,先把十二个方向分清楚。由交通的对应关系,得到最后四条线。最后只要考虑到四条线切换就好了。统一编程模式,右转也有灯,常绿。模式就简单了。面向对象的分析与设计:初步设想有哪些对象:红绿灯,红绿灯的控制系统,汽车,路线。汽车看到前面的灯绿了,就穿过路吗?不是,还要看前面是否有车。问前面是否有车,该问谁呢?问路,路上装着很多车。路中存储车辆的集合。路上有增加车辆和减少车辆的方法。下面我们就了解面向对象的重要经验。谁拥有数据,谁就有数据的操作方法。案例:人在黑板上画圆。person,blackboard,circle对象。draw(),这个方法应该谁有?是人吗?不是,是圆,因为圆自己才知道半径。想一想列车司机刹车。人关门。学员面对对象的面试题,用面向对象的方式设计。小球从绳子的一端移动到另一端。通过构造方法绑定。两块石头磨成一把刀,刀砍树,变成木材,材做成椅子。石头加工厂,有一个方法:石头加工成刀。刀有一个方法,木材变成树。椅子加工厂,木材变成椅子。我们只是捕捉车辆穿过路口的过程,也就是减少一个的过程,不是车移动的过程。所以,这个车不需要单独的对象,用字符串表示就可以了。灯有12个,那我们就想到了枚举。*/import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class Road {private List<String> vechicles = new ArrayList<String>();private String name = null;public Road(String name){this.name = name;//1.5的线程。Executors记住这个词。ExecutorService pool = Executors.newSingleThreadExecutor();pool.execute(new Runnable(){public void run() {for(int i=1;i<1000;i++){try {Thread.sleep((new Random().nextInt(5)+1)*1000);//用随机更现实。} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}vechicles.add(Road.this.name+"_"+i);}}});//定义定时器ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable(){public void run() {if(vechicles.size()>0){boolean lighted = Lamp.valueOf(Road.this.name).isLighted();if(lighted){System.out.println(vechicles.remove(0)+":is traversing!!!");}}}}, 1,1, TimeUnit.SECONDS);//每隔多少秒。}}public enum Lamp {S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);/* * S2N,S2W,E2W,E2S,N2S,N2E,W2E,W2N,S2E,E2N,N2W,W2S;*/private Lamp(String opposite,String next,boolean lighted){this.opposite=opposite;this.next = next;this.lighted = lighted;}//private Lamp(){}private boolean lighted;private String opposite;private String next;public boolean isLighted(){return lighted;}public void light(){this.lighted = true;if(opposite!=null){Lamp.valueOf(opposite).light();//返回名字对应的枚举对象。}System.out.println(name()+"-lamp is green,下面有六个方向的车子穿过");}public  Lamp blackOut(){this.lighted=false;if(opposite!=null){Lamp.valueOf(opposite).blackOut();//返回名字对应的枚举对象。}//Lamp nextLamp= Lamp.valueOf(next);这样写会出现问题。Lamp nextLamp= null;if(next!=null){nextLamp = Lamp.valueOf(next);System.out.println("绿灯从"+name()+"切换到"+next);nextLamp.light();}return nextLamp;}}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.S2N;currentLamp.light();ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable(){public void run() {// 每隔秒把当前的灯变黑。 currentLamp = currentLamp.blackOut();//这个方法会返回下一个灯。}}, 2, //多长时间5, //以后每隔TimeUnit.SECONDS);}}public class MainClass {/**测试程序。 * @param args */public static void main(String[] args) {String [] directions = new String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};for (int i=0;i<directions.length;i++){new Road(directions[i]);}new LampController();}}
原创粉丝点击