黑马程序员——7K面试题交通灯(My)
2014-08-14 10:43
169 查看
-------
android培训、java培训、期待与您交流! ----------
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
1、异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆 ---- 右转车辆
由东向而来去往南向的车辆 ---- 左转车辆
。。。
2、信号灯忽略黄灯,只考虑红灯和绿灯。
3、应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
4、具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
5、每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
6、随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
7、不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
以上是需要做的题,但是呢!!我自己将题目该了一下。还请老师帮忙看一下代码以及运行效果。(不运行随时右转,必须按照红绿灯指示)
以下是我画了一张图:
从我的题中要求得知,红绿灯 只能允许 一面 行动,而且他行动的方位 只有3个方向。
我的思考方式:我有一个控制器,该控制器控制着 (东南西北) 4组 红绿灯。每一组红绿灯都对应着对面的路
当 南面 为 红灯时,只允许 北面车 行动,
当 东面 为 红灯时,只允许 西面车 行动,
当 北面 为 红灯时,只允许 南门车 行动,
当 西面 为 红灯时,只允许 东面车 行动。
东南西北都有随时随地来的车。(通过4个线程开启,每一个线程都对应着自己的那条路,随机时间产生随机车)
当 允许行动的那条路线可以行动时,则进行 1秒 remove 一辆车。
我的代码展示:
lamp类:每一个灯都有自己的固定时间,然后有一个返回下一个灯的时间(主要是来源于 张老师第一次将 enum 那个时候就想做红绿灯了)
Roud类:只有路才知道 有 多少辆车,只有路才能将车移动。(面向对象设计)
Monitor类 : 控制器控制 灯,灯控制路,路控制车。
MainClass类:创建控制器对象。调用 通电方法 。让程序跑起来。
下次是程序部分运行的结果:
尊敬的老师:由于我没有根据张老师的那个要求做,还请抽点时间帮我一下。((*^__^*) 嘻嘻,虽然有点啰嗦,麻烦老师了)
android培训、java培训、期待与您交流! ----------
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
1、异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆 ---- 右转车辆
由东向而来去往南向的车辆 ---- 左转车辆
。。。
2、信号灯忽略黄灯,只考虑红灯和绿灯。
3、应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
4、具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
5、每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
6、随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
7、不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
以上是需要做的题,但是呢!!我自己将题目该了一下。还请老师帮忙看一下代码以及运行效果。(不运行随时右转,必须按照红绿灯指示)
以下是我画了一张图:
从我的题中要求得知,红绿灯 只能允许 一面 行动,而且他行动的方位 只有3个方向。
我的思考方式:我有一个控制器,该控制器控制着 (东南西北) 4组 红绿灯。每一组红绿灯都对应着对面的路
当 南面 为 红灯时,只允许 北面车 行动,
当 东面 为 红灯时,只允许 西面车 行动,
当 北面 为 红灯时,只允许 南门车 行动,
当 西面 为 红灯时,只允许 东面车 行动。
东南西北都有随时随地来的车。(通过4个线程开启,每一个线程都对应着自己的那条路,随机时间产生随机车)
当 允许行动的那条路线可以行动时,则进行 1秒 remove 一辆车。
我的代码展示:
lamp类:每一个灯都有自己的固定时间,然后有一个返回下一个灯的时间(主要是来源于 张老师第一次将 enum 那个时候就想做红绿灯了)
public enum Lamp { RED(10){ public Lamp nextLamp() { return GREEN_3; } }, GREEN_3(30){ public Lamp nextLamp() { return RED; } }, GREEN_2(20) { public Lamp nextLamp() { return RED; } }, GREEN_1(10) { public Lamp nextLamp() { return RED; } }; protected int time; private Lamp(int time) { this.time = time; } public abstract Lamp nextLamp(); }
Roud类:只有路才知道 有 多少辆车,只有路才能将车移动。(面向对象设计)
import java.util.ArrayList; import java.util.List; import java.util.Random; public class Roud { List<String> s = new ArrayList<String>(); //南 List<String> w = new ArrayList<String>(); //西 List<String> n = new ArrayList<String>(); //北 List<String> e = new ArrayList<String>(); //东 /**只要一被创建对象,我就开启4线程。 * */ Roud() { new Thread(new RoudAddCar(s, "s")).start(); //传入集合,和 路面 new Thread(new RoudAddCar(w, "w")).start(); new Thread(new RoudAddCar(n, "n")).start(); new Thread(new RoudAddCar(e, "e")).start(); } //路要和删除的方法。 public void removeCar(List<String> list, String roudName) { if(list.size()>0) { list.remove(0); System.out.println(roudName + " _ remove a car , 待过的还有 : " + list.size()); } } } class RoudAddCar implements Runnable //添加车辆线程 { private String roudName; private List<String> list; public void run() { for(int i=1; list.size()<500 ; i++) //单条路线大于500就该请交警队了 { try { Thread.sleep( (new Random().nextInt(10) + 1)*1000 ); //1~10,在乘以1000,在1~10秒内随机时间内产生车辆 list.add(roudName + "_" + i ); System.out.println(roudName + " add one"); } catch (InterruptedException e) { e.printStackTrace(); } } } RoudAddCar(List<String> list,String roudName) { this.list = list; this.roudName = roudName; } }
Monitor类 : 控制器控制 灯,灯控制路,路控制车。
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Monitor { Roud roud = new Roud(); public Lamp sLamp = Lamp.RED; //南 public Lamp wLamp = Lamp.GREEN_3; //西 对应 东 public Lamp nLamp = Lamp.GREEN_2; //北 对应 南 public Lamp eLamp = Lamp.GREEN_1; //东 对应 西 public void energization() //控制器通电后开启4线程。 { ExecutorService pools = Executors.newFixedThreadPool(1); pools.execute(new Runnable(){ public void run() { while(true) { if(sLamp == Lamp.RED) //南s 对应 北n,让 北面的车走。 { System.out.println("RED等切换为:S 面,只 允许 N 面开车"); int time = sLamp.time; while(time>0) { threadSleep(); synchronized(Monitor.class) { System.out.println("S 面,Led---------->true: " + --time + "秒"); roud.removeCar(roud.n, "N"); } } sLamp = sLamp.nextLamp();<span style="white-space:pre"> //当 time<=0的时候。就切换灯 } else { int overTime = sLamp.time; while(overTime>0) { threadSleep(); synchronized(Monitor.class) { System.out.println("S 面,Led---->false: " + --overTime + "秒"); } } sLamp = sLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//当 time<=0的时候。就切换灯</span> } } } }); ExecutorService poolw = Executors.newFixedThreadPool(1); poolw.execute(new Runnable(){ public void run() { while(true) { if(wLamp == Lamp.RED) //西w 对应 东e,让 东面的车走。 { System.out.println("RED等切换为:W 面,只允许 E 面开车 "); int time = wLamp.time; while(time>0) { threadSleep(); synchronized(Monitor.class) { System.out.println("W 面,Led---------->true: " + --time + "秒"); roud.removeCar(roud.e, "E"); } } <span style="font-family: Arial, Helvetica, sans-serif;">sLamp = sLamp.nextLamp();//</span><span style="font-family: Arial, Helvetica, sans-serif;">当 time<=0的时候。就切换灯</span> } else { int overTime = wLamp.time; while(overTime>0) { threadSleep(); synchronized(Monitor.class) { System.out.println("W 面,Led---->false: " + --overTime + "秒"); } } wLamp = wLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">当 time<=0的时候。就切换灯</span> } } } }); ExecutorService pooln = Executors.newFixedThreadPool(1); pooln.execute(new Runnable(){ public void run() { while(true) { if(nLamp == Lamp.RED) //北n 对应 南s,让 南面的车走。 { System.out.println("RED等切换为:N 面,只允许 S 面 开车"); int time = nLamp.time; while(time>0) { threadSleep(); synchronized(Monitor.class) { System.out.println("N 面, Led---------->true: " + --time + "秒"); roud.removeCar(roud.s, "S"); } } nLamp = nLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">当 time<=0的时候。就切换灯</span> } else { int overTime = nLamp.time; while(overTime>0) { threadSleep(); synchronized(Monitor.class) { System.out.println("N 面,Led---->false: " + --overTime + "秒"); } } nLamp = nLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">当 time<=0的时候。就切换灯</span> } } } }); ExecutorService poole = Executors.newFixedThreadPool(1); poole.execute(new Runnable(){ public void run() { while(true) { if(eLamp == Lamp.RED) //东e 对应 西w,让 西面的车走。 { System.out.println("RED等切换为:E 面,只允许 W 面 开车 "); int time = eLamp.time; while(time>0) { threadSleep(); synchronized(Monitor.class) { System.out.println("E 面, Led---------->true: " + --time + "秒"); roud.removeCar(roud.w, "W"); } } eLamp = eLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">当 time<=0的时候。就切换灯</span> } else { int overTime = eLamp.time; while(overTime>0) { threadSleep(); synchronized(Monitor.class) { System.out.println("E 面,Led---->false: " + --overTime + "秒"); } } eLamp = eLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">当 time<=0的时候。就切换灯</span> } } } }); } public void threadSleep() // 车辆过的时候需要停留1秒钟 { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }
MainClass类:创建控制器对象。调用 通电方法 。让程序跑起来。
public class MainClass { public static void main(String[] args) { new } }
下次是程序部分运行的结果:
RED等切换为:S 面,只 允许 N 面开车 S 面,Led---------->true: 9秒 N 面,Led---->false: 19秒 W 面,Led---->false: 29秒 E 面,Led---->false: 9秒 S 面,Led---------->true: 8秒 W 面,Led---->false: 28秒 N 面,Led---->false: 18秒 E 面,Led---->false: 8秒 S 面,Led---------->true: 7秒 N 面,Led---->false: 17秒 W 面,Led---->false: 27秒 E 面,Led---->false: 7秒 s add one n add one S 面,Led---------->true: 6秒 N _ remove a car , 待过的还有 : 0 N 面,Led---->false: 16秒 W 面,Led---->false: 26秒 E 面,Led---->false: 6秒 n add one w add one S 面,Led---------->true: 5秒 N _ remove a car , 待过的还有 : 0 W 面,Led---->false: 25秒 N 面,Led---->false: 15秒 E 面,Led---->false: 5秒 e add one S 面,Led---------->true: 4秒 N 面,Led---->false: 14秒 W 面,Led---->false: 24秒 E 面,Led---->false: 4秒 S 面,Led---------->true: 3秒 N 面,Led---->false: 13秒 W 面,Led---->false: 23秒 E 面,Led---->false: 3秒 S 面,Led---------->true: 2秒 N 面,Led---->false: 12秒 W 面,Led---->false: 22秒 E 面,Led---->false: 2秒 s add one n add one S 面,Led---------->true: 1秒 N _ remove a car , 待过的还有 : 0 N 面,Led---->false: 11秒 W 面,Led---->false: 21秒 E 面,Led---->false: 1秒 S 面,Led---------->true: 0秒 N 面,Led---->false: 10秒 W 面,Led---->false: 20秒 E 面,Led---->false: 0秒 RED等切换为:E 面,只允许 W 面 开车 s add one S 面,Led---->false: 29秒 N 面,Led---->false: 9秒 W 面,Led---->false: 19秒 E 面, Led---------->true: 9秒 W _ remove a car , 待过的还有 : 0 S 面,Led---->false: 28秒 W 面,Led---->false: 18秒 N 面,Led---->false: 8秒 E 面, Led---------->true: 8秒 s add one S 面,Led---->false: 27秒 N 面,Led---->false: 7秒 W 面,Led---->false: 17秒 E 面, Led---------->true: 7秒 S 面,Led---->false: 26秒 N 面,Led---->false: 6秒 W 面,Led---->false: 16秒 E 面, Led---------->true: 6秒 w add one n add one S 面,Led---->false: 25秒 N 面,Led---->false: 5秒 W 面,Led---->false: 15秒 E 面, Led---------->true: 5秒 W _ remove a car , 待过的还有 : 0 e add one S 面,Led---->false: 24秒 N 面,Led---->false: 4秒 W 面,Led---->false: 14秒 E 面, Led---------->true: 4秒 e add one S 面,Led---->false: 23秒 N 面,Led---->false: 3秒 W 面,Led---->false: 13秒 E 面, Led---------->true: 3秒 n add one S 面,Led---->false: 22秒 N 面,Led---->false: 2秒 W 面,Led---->false: 12秒 E 面, Led---------->true: 2秒 n add one S 面,Led---->false: 21秒 W 面,Led---->false: 11秒 N 面,Led---->false: 1秒 E 面, Led---------->true: 1秒 s add one S 面,Led---->false: 20秒 N 面,Led---->false: 0秒 RED等切换为:N 面,只允许 S 面 开车 W 面,Led---->false: 10秒 E 面, Led---------->true: 0秒 S 面,Led---->false: 19秒 W 面,Led---->false: 9秒 N 面, Led---------->true: 9秒 S _ remove a car , 待过的还有 : 4 E 面,Led---->false: 29秒 S 面,Led---->false: 18秒 N 面, Led---------->true: 8秒 S _ remove a car , 待过的还有 : 3 W 面,Led---->false: 8秒 E 面,Led---->false: 28秒 w add one S 面,Led---->false: 17秒 W 面,Led---->false: 7秒 N 面, Led---------->true: 7秒 S _ remove a car , 待过的还有 : 2 E 面,Led---->false: 27秒 S 面,Led---->false: 16秒 W 面,Led---->false: 6秒 N 面, Led---------->true: 6秒 S _ remove a car , 待过的还有 : 1 E 面,Led---->false: 26秒 n add one e add one S 面,Led---->false: 15秒 W 面,Led---->false: 5秒 N 面, Led---------->true: 5秒 S _ remove a car , 待过的还有 : 0 E 面,Led---->false: 25秒 S 面,Led---->false: 14秒 N 面, Led---------->true: 4秒 W 面,Led---->false: 4秒 E 面,Led---->false: 24秒 e add one s add one S 面,Led---->false: 13秒 N 面, Led---------->true: 3秒 S _ remove a car , 待过的还有 : 0 W 面,Led---->false: 3秒 E 面,Led---->false: 23秒 S 面,Led---->false: 12秒 N 面, Led---------->true: 2秒 W 面,Led---->false: 2秒 E 面,Led---->false: 22秒 S 面,Led---->false: 11秒 N 面, Led---------->true: 1秒 W 面,Led---->false: 1秒 E 面,Led---->false: 21秒 w add one S 面,Led---->false: 10秒 N 面, Led---------->true: 0秒 W 面,Led---->false: 0秒 RED等切换为:W 面,只允许 E 面开车 E 面,Led---->false: 20秒 S 面,Led---->false: 9秒 N 面,Led---->false: 29秒 W 面,Led---------->true: 9秒 E _ remove a car , 待过的还有 : 4 E 面,Led---->false: 19秒
尊敬的老师:由于我没有根据张老师的那个要求做,还请抽点时间帮我一下。((*^__^*) 嘻嘻,虽然有点啰嗦,麻烦老师了)
相关文章推荐
- 黑马程序员_7K面试题--交通灯管理系统
- 黑马程序员_7k面试题之交通灯管理系统
- 黑马程序员_7K面试题之交通灯管理系统
- 黑马程序员_7K面试题之交通灯系统
- 【黑马程序员】java 7k面试题--交通灯管理系统
- 黑马程序员-张孝祥-7K月薪面试题破解之一_交通灯管理系统
- 黑马程序员_7K月薪面试题交通灯管理系统
- 黑马程序员11-7k面试题交通灯
- 黑马程序员_7K月薪面试题破解之一_交通灯管理系统
- 黑马程序员_7K面试题:十字路口的交通灯管理系统
- 【黑马程序员】 学习笔记 - 直击7K面试题 - 张孝祥老师的交通等管理系统
- 【黑马程序员】7k面试题之交通灯
- 黑马程序员_Java学习笔记之7K面试题交通等管理系统
- 黑马程序员_7K面试题之交通灯管理系统
- 黑马程序员_7k面试题之交通灯管理系统
- 黑马程序员java学习日记十六 7k面试题交通灯管理系统讲解
- 黑马程序员——7k面试题——交通灯管理系统
- 【黑马程序员】Java7K面试题20:交通灯管理系统
- 黑马程序员 Java基础 --->7K面试题之交通灯管理系统
- “黑马程序员”7k面试题之交通灯管理系统