知识大全 java面试题之一:交通灯管理系统

Posted 路线

篇首语:只给君子看门,不给小人当家。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 java面试题之一:交通灯管理系统相关的知识,希望对你有一定的参考价值。

背景介绍 软件开发公司现在都越来越精明和狡猾了 他们把日后工作中要解决的问题 并且是他们自己都很难解决的问题拿出来让面试求职者去搞 不管面试求职者的水平怎样 他们都说谁能搞定 谁就来上班 这样至少求职者在进公司之前就已经为公司做了贡献 软件公司这招够狠 够高! 题目来源 前一阵子的某一天中午 有一个学员打电话给我说 他去国内某大型的软件外包公司应聘了 要求的薪水是 k 该公司给了他一道面试题 就是要做一个模拟的交通灯管理系统 并说公司外包了一个法国交通系统的项目 现在就是在替做这个交通系统的项目组招人 这个交通灯管理系统就是招聘进来的人上班后要开发的项目模型 如果他在家三天内能够做出来 他就可以入职上班了 并且他要求的薪水则不是任何问题 还可以更高一些 这个同学做了两天 感到很困难 于是打电话向我求助 我让他把题目发到我的邮箱 晚上 又有一个学员给我打电话 说是去某公司面试了 该公司让他做一个交通灯管理系统 三天内做出来就可以直接去上班 我马上告诉他 已经有一个同学先他一步来找我了 我只能满足他们两人中的一人 否则 他们就会出现答案雷同 最后对他们两人都造成不利影响 后来 又有几个学员拿着不同公司的面试题找我 题目如出一辙 都是公司要求把日后的项目拿回家做 什么时候做好就什么时候上班 看来以后靠背我们的面试宝典来突击找工作的方式越来越困难了 软件公司把他们项目中的复杂问题拿出来让面试者做 如果面试者正好是传智播客的学员 他们必将求助于我们 我们这批老师也就顺理成章地成为这些公司免费使用的超级劳工 这些软件公司精心策划的项目题确实都有很强的技术性和实用价值 在此感谢奉献了这些题目的学员 在征得这些学员们的同意后 我将逐步公布和讲解这些项目面试题 下面是某公司的交通灯管理系统的需求 交通灯管理系统

模拟实现十字路口的交通灯管理系统逻辑 具体需求如下

异步随机生成按照各个路线行驶的车辆

例如 由南向而来去往北向的车辆&# ; 直行车辆 由西向而来去往南向的车辆&# ; 右转车辆 由东向而来去往南向的车辆&# ; 左转车辆

信号灯忽略黄灯 只考虑红灯和绿灯

应考虑左转车辆控制信号灯 右转车辆不受信号灯控制

具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同 不考虑特殊情况下的控制逻辑

注 南北向车辆与东西向车辆交替放行 同方向等待车辆应先放行直行车辆而后放行左转车辆

每辆车通过路口时间为 秒(提示 可通过线程Sleep的方式模拟)

随机生成车辆时间间隔以及红绿灯交换时间间隔自定 可以设置

不要求实现GUI 只考虑系统逻辑实现 可通过Log方式展现程序运行结果

解题思路

首先 为了较好地理解和分析问题 切不可空想 一定要画图!画图非常有助于理解和分析问题 你还有比画图更好的办法吗?

我画的交通灯路线图如下

接着进行面向对象的分析和设计

(一)每条路线上都会出现多辆车 路线上要随机增加新的车 在灯绿期间还要每秒钟减少一辆车 设计一个Road类来表示路线 每个Road对象代表一条路线 总共有 条路线 即系统中总共要产生 个Road实例对象 每条路线上随机增加新的车辆 增加到一个集合中保存 每条路线每隔一秒都会检查控制本路线的灯是否为绿 是则将本路线保存车的集合中的第一辆车移除 即表示车穿过了路口 (二)每条路线每隔一秒都会检查控制本路线的灯是否为绿 一个灯由绿变红时 应该将下一个方向的灯变绿 设计一个Lamp类来表示一个交通灯 每个交通灯都维护一个状态 亮(绿)或不亮(红) 每个交通灯要有变亮和变黑的方法 并且能返回自己的亮黑状态 总共有 条路线 所以 系统中总共要产生 个交通灯 右拐弯的路线本来不受灯的控制 但是为了让程序采用统一的处理方式 故假设出有四个右拐弯的灯 只是这些灯为常亮状态 即永远不变黑 除了右拐弯方向的其他 条路线的灯 它们是两两成对的 可以归为 组 所以 在编程处理时 只要从这 组中各取出一个灯 对这 个灯依次轮询变亮 与这 个灯方向对应的灯则随之一同变化 因此Lamp类中要有一个变量来记住自己相反方向的灯 在一个Lamp对象的变亮和变黑方法中 将对应方向的灯也变亮和变黑 每个灯变黑时 都伴随者下一个灯的变亮 Lamp类中还用一个变量来记住自己的下一个灯 无论在程序的什么地方去获得某个方向的灯时 每次获得的都是同一个实例对象 所以Lamp类改用枚举来做显然具有很大的方便性 永远都只有代表 个方向的灯的实例对象 设计一个LampController类 它定时让当前的绿灯变红

类的编码实现

(一)Road类 每个Road对象都有一个name成员变量来代表方向 有一个vehicles成员变量来代表方向上的车辆集合 在Road对象的构造方法中启动一个线程每隔一个随机的时间向vehicles集合中增加一辆车(用一个 路线名_id 形式的字符串进行表示) 在Road对象的构造方法中启动一个定时器 每隔一秒检查该方向上的灯是否为绿 是则打印车辆集合和将集合中的第一辆车移除掉 源码如下 package it interview traffic;import java util ArrayList;import java util List;import java util Random;import java util concurrent Executors;import java util concurrent TimeUnit;/** * 每个Road对象代表一条路线 总共有 条路线 即系统中总共要产生 个Road实例对象 * 每条路线上随机增加新的车辆 增加到一个集合中保存 * 每条路线每隔一秒都会检查控制本路线的灯是否为绿 是则将本路线保存车的集合中的第一辆车移除 即表示车穿过了路口 * @author IBM * */public class Road private String direction;private List vehicles = new ArrayList();public Road(String dir)this direction = dir;//模拟车辆不断上路的过程Executors newSingleThreadExecutor() execute(new Runnable()public void run()for(int i= ;i< ;i++)vehicles add(direction + &# ;:&# ; + i);//System out println(&# ;add &# ; + direction + &# ;:&# ; + i);try Thread sleep(new Random() nextInt( )); catch (InterruptedException e) e printStackTrace(););//每隔一秒检查对应的灯是否为绿 是则放行一辆车Executors newScheduledThreadPool( ) scheduleAtFixedRate(new Runnable()public void run()Lamp lamp = Lamp valueOf(direction);if(lamp isLighted())if(vehicles size() > )System out println(vehicles remove( ) + &# ; is traversing &# ;); TimeUnit SECONDS); (二)Lamp类 系统中有 个方向上的灯 在程序的其他地方要根据灯的名称就可以获得对应的灯的实例对象 综合这些因素 将Lamp类用java 中的枚举形式定义更为简单 每个Lamp对象中的亮黑状态用lighted变量表示 选用S N S W E W E N这四个方向上的Lamp对象依次轮询变亮 Lamp对象中还要有一个oppositeLampName变量来表示它们相反方向的灯 再用一个nextLampName变量来表示此灯变亮后的下一个变亮的灯 这三个变量用构造方法的形式进行赋值 因为枚举元素必须在定义之后引用 所以无法再构造方法中彼此相互引用 所以 相反方向和下一个方向的灯用字符串形式表示 增加让Lamp变亮和变黑的方法 light和blackOut 对于S N S W E W E N这四个方向上的Lamp对象 这两个方法内部要让相反方向的灯随之变亮和变黑 blackOut方法还要让下一个灯变亮 除了S N S W E W E N这四个方向上的Lamp对象之前 其他方向上的Lamp对象的nextLampName和oppositeLampName属性设置为null即可 并且S N S W E W E N这四个方向上的Lamp对象的nextLampName和oppositeLampName属性必须设置为null 以便防止light和blackOut进入死循环 源码如下 package it interview traffic;/** * 每个Lamp元素代表一个方向上的灯 总共有 个方向 所有总共有 个Lamp元素 * 有如下一些方向上的灯 每两个形成一组 一组等同时变绿或变红 所以 * 程序代码只需要控制每组灯中的一个灯即可 * s n n s * s w n e * e w w e * e s w n * s e n w * e n w s * 上面最后两行的灯是虚拟的 由于从南向东和从西向北 以及它们的对应方向不受红绿灯的控制 * 所以 可以假想它们总是绿灯 * @author IBM * *//**/public enum Lamp/*每个枚举元素各表示灯控制的一个方向*/S N(&# ;N S&# ; false &# ;S W&# ;) S W(&# ;N E&# ; false &# ;E W&# ;) E W(&# ;W E&# ; false &# ;E S&# ;) E S(&# ;W N&# ; false &# ;S N&# ;) /*由南向东和由西向北不受红绿灯的控制 所以 可以假想它们总是绿灯*/S E(&# ;N W&# ; true &# ;S E&# ;) E N(&# ;W S&# ; true &# ;E N&# ;) /*下面元素表示与上面的元素的相反方向的灯 其中所有的参数值不重要 应忽略不计!*/N S(null false null) N E(null false null) W E(null false null) W N(null false null) N W(null true null) W S(null true null);/*灯是否为绿*/private boolean lighted;/*与灯同时为绿的对应方向*/private String opposite;/*灯变红时下一个变绿的灯*/private String next;private Lamp(String opposite boolean lighted String next)this opposite = opposite;this lighted = lighted;this next = next;/** * 灯变绿时 它对应方向的灯也要变绿 */public void light()this lighted = true;if(opposite!=null)Lamp lampOpposite = Lamp valueOf(opposite);lampOpposite light();System out println(name() + &# ; lamp is green 下面总共应该有 个方向能看到汽车穿过!&# ;);public boolean isLighted()return lighted;/** * 灯变红时 对应方向的灯也要变红 并且下一个方向的灯要变绿 * @return 下一个要变绿的灯 */public Lamp blackOut()this lighted = false;if(opposite!=null)Lamp lampOpposite = Lamp valueOf(opposite);lampOpposite blackOut();Lamp nextLamp = null;if(next != null)nextLamp = Lamp valueOf(next);nextLamp light();System out println(&# ;绿灯从&# ; + name() + &# ;&# ;&# ;&# ;>切换为&# ; + next);return nextLamp; (三)LampController类 整个系统中只能有一套交通灯控制系统 所以 LampController类最好是设计成单例 LampController构造方法中要设定第一个为绿的灯 LampController对象的start方法中将当前灯变绿 然后启动一个定时器 每隔 将当前灯变红和将下一个灯变绿 源码如下 package it interview traffic;import java util concurrent Executors;import java util concurrent TimeUnit;public class LampController private static LampController instance = new LampController();public static LampController getInstance()return instance;private Lamp currentLamp = null;private LampController()//刚开始让由南向北的灯变绿;currentLamp = Lamp S N;public void start()currentLamp light();/*每隔 秒将当前绿灯变为红灯 并让下一个方向的灯变绿*/Executors newScheduledThreadPool( ) scheduleAtFixedRate(new Runnable()public void run()currentLamp = currentLamp blackOut(); TimeUnit SECONDS); (四)MainClass类 用for循环创建出代表 条路线的对象 接着再获得LampController对象并调用其start方法 源码如下 package it interview traffic;public class MainClass /** * @param args */public static void main(String[] args) /*产生 个方向的路线*/String [] directions = &# ;S N&# ; &# ;N S&# ; &# ;S W&# ; &# ;N E&# ; &# ;E W&# ; &# ;W E&# ; &# ;E S&# ; &# ;W N&# ; &# ;S W&# ; &# ;N W&# ; &# ;E N&# ; &# ;W S&# ;;for(int i= ;i<directions length;i++)new Road(directions);/*产生整个交通灯系统*/LampController getInstance() start();

cha138/Article/program/Java/JSP/201405/30947

相关参考

知识大全 Java Struts几个面试题

JavaStruts几个面试题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!cha138

知识大全 java面试、答辩题(3)

java帮助文档是如何生成的?Javadocexe什么时候类名和文件名必须一致?当类的定义为Public时类名必须与文件名保存一致如何将实现包装类和基本数据类型转化?包装转基本:包装类对象xxxval

知识大全 Java及数据库面试题 包含SSH,数据库和Java基础

Java及数据库面试题包含SSH,数据库和Java基础  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 2012年遇到的最新的Java面试题 请参考

2012年遇到的最新的Java面试题请参考  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!实现Fib

知识大全 探讨Java中最常见的十道面试题

探讨Java中最常见的十道面试题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  第一谈谈fina

知识大全 JAVA程序员面试32问,你能回答多少题?

JAVA程序员面试32问,你能回答多少题?  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  第一谈

知识大全 博惠思华Java开发工程师面试题及答案

博惠思华Java开发工程师面试题及答案  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!连接数据库使用

知识大全 上海达内学员赴贝尔阿尔卡特面试题分享

cha138/Article/program/Java/JSP/201405/30953

知识大全 500强企业面试题大揭秘

   下水道井盖为什么是圆的?」「如果此时有一艘太空梭着陆你会进去吗?」不要以为这只是些异想天开的怪问题,这些可都是来自世界500强企业之一微软公司的经典面试题,而揭秘这

知识大全 DELL戴尔的英文面试题(硬体部分和作业系统)

DELL戴尔的英文面试题(硬体部分和作业系统)  以下文字资料是由(本站网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb