`
小驴变黑马
  • 浏览: 12006 次
文章分类
社区版块
存档分类

黑马学习日记_破解面试题之信号灯

阅读更多

---------------------- android开发java培训、期待与您交流! ----------------------


项目需求
异步随机生成按照各个路线行驶的车辆。
例如:
  由南向而来去往北向的车辆 ---- 直行车辆
  由西向而来去往南向的车辆 ---- 右转车辆
  由东向而来去往南向的车辆 ---- 左转车辆
  。。。
 
信号灯忽略黄灯,只考虑红灯和绿灯。
 
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
 
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
 
每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
 
随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
 
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
-----------------------------------------------------------------------
一.Road类
每个Road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表
方向上的车辆集合。
 
在Road对象的构造方法中启动一个线程每隔一个随机的时间向vehicles集合中增加
一辆车(用一个“路线名_id”形式的字符串进行表示)。
 
在Road对象的构造方法中启动一个定时器,每隔一秒检查该方向上的灯是否为绿,
是则打印车辆集合和将集合中的第一辆车移除掉。
 
public class Road 
{
private List vechicles = new ArrayList();
private String name =null;
public Road(String name)
{
this.name = name;
 
//模拟车辆不断随机上路的过程
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(new Runnable()
{
public void run(){
for(int i=1;i<1000;i++)
{
try 
{
Thread.sleep((new Random().nextInt(10) + 1) * 1000);
} 
catch (InterruptedException e) 
{
e.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);
}
}
 -----------------------------------------------------------------------
二.枚举Lamp类
 
系统中有12个方向上的灯,在程序的其他地方要根据灯的名称就可以获得对应的灯的实例对象,综合
这些因素,将Lamp类用java5中的枚举形式定义更为简单。
 
每个Lamp对象中的亮黑状态用lighted变量表示,选用S2N、S2W、E2W、E2N这四个方向上的Lamp对象
依次轮询变亮,Lamp对象中还要有一个oppositeLampName变量来表示它们相反方向的灯,再用一个
nextLampName变量来表示此灯变亮后的下一个变亮的灯。这三个变量用构造方法的形式进行赋值,因
为枚举元素必须在定义之后引用,所以无法再构造方法中彼此相互引用,所以,相反方向和下一个方
向的灯用字符串形式表示。
 
增加让Lamp变亮和变黑的方法:light和blackOut,对于S2N、S2W、E2W、E2N这四个方向上的Lamp对象,
这两个方法内部要让相反方向的灯随之变亮和变黑,blackOut方法还要让下一个灯变亮。
 
除了S2N、S2W、E2W、E2N这四个方向上的Lamp对象之外,其他方向上的Lamp对象的nextLampName和
oppositeLampName属性设置为null即可,并且S2N、S2W、E2W、E2N这四个方向上的Lamp对象的
nextLampName和oppositeLampName属性必须设置为null,以便防止light和blackOut进入死循环。
 
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);
 
private Lamp(String opposite,String next,boolean lighted)
{
this.opposite = opposite;
this.next = next;
this.lighted = lighted;
}
 
 
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,下面总共应该有6个方向能看到汽车穿过!");
}
 
 
public Lamp blackOut()
{
this.lighted = false;
if(opposite != null)
{
Lamp.valueOf(opposite).blackOut();
} 
 
Lamp nextLamp= null;
if(next != null)
{
nextLamp = Lamp.valueOf(next);
System.out.println("绿灯从" + name() + "-------->切换为" + next);
nextLamp.light();
}
return nextLamp;
}
}
 
 用枚举类定义灯可以得到简化。
知识点1:Lamp枚举类中有个静态方法valueOf()
例如:Lamp.valueOf(opposite);
把名字传进去,就会返回这个名字对应的枚举对象,再去调用对应的方法;
-----------------------------------------------------------------------
三.灯的控制器LampController类
 
整个系统中只能有一套交通灯控制系统,所以,LampController类最好是设计成单例。
 
LampController构造方法中要设定第一个为绿的灯。
 
LampController对象的start方法中将当前灯变绿,然后启动一个定时器,每隔10秒将当前灯
变红和将下一个灯变绿。
部分代码:
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(){
System.out.println("来啊");
currentLamp = currentLamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
}
 -----------------------------------------------------------------------
四.主函数
用for循环创建出代表12条路线的对象。
接着再获得LampController对象并调用其start方法。
部分代码:
public class MainClass 
{
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
{
new Road(directions[i]);
}
 
 
new LampController();
}
}
 
 
---------------------- android开发java培训、期待与您交流! ----------------------
分享到:
评论

相关推荐

    黑马程序员入学面试题

    ### 第三部分面试题 #### 47. collection和collections的区别 - `Collection`:接口,是Java集合框架的基础接口之一。 - `Collections`:工具类,提供了一系列静态方法用于操作集合。 #### 48. list,set,map是否...

    黑马面试题总结

    ### 黑马面试题总结 #### 一、进程与线程状态 **知识点:** - **进程与线程的区别:** - **进程**:是系统进行资源分配和调度的基本单位,每个进程都有独立的代码和数据空间(程序上下文)。 - **线程**:是...

    JAVAAndroid面试题讲解视频

    资源名称:JAVA Android面试题讲解视频资源目录:【】2012黑马程序员01_面试题【】2012黑马程序员02_面试题【】2012黑马程序员03_面试题【】2012黑马程序员04_面试题【】225ce844c6c817e9614d8f17ea70a640【】...

    黑马面试题

    "黑马面试题"这个主题很可能指的是来自知名IT教育机构“黑马程序员”所设计的一系列面试题目,这些题目旨在测试应聘者的编程基础、算法理解、系统设计能力以及对最新技术趋势的掌握。 首先,我们来探讨一些常见的...

    黑马java面试题总结

    "黑马java面试题总结"很可能是一个包含了这些主题的资源包,旨在帮助Java开发者准备面试,提升对技术的理解和应用能力。 首先,Java基础知识是面试中的常考项,包括但不限于语法特性(如封装、继承、多态)、面向...

    《JAVA面试题》--JAVA 黑马程序员 面试宝典全学科.zip

    十余年JAVA从业经验,精通JAVA技术体系,有志于做JAVA技能提升的朋友可与我联系,交个朋友 十余年JAVA从业经验,精通JAVA技术体系,有志于做JAVA技能提升的朋友可与我联系,交个朋友 十余年JAVA从业经验,精通JAVA...

    2018年黑马程序最新面试题汇总

    "2018年黑马程序最新面试题汇总" 这个标题表明了这是一份针对2018年度编程面试的资源集合,由“黑马程序”提供,可能是一个教育机构或者在线学习平台。关键词“最新”暗示这份资料包含了当年最新的面试题目,对求职...

    Java 面试题库,2018-2019年黑马最新版Java程序员面试宝典+题库pdf.zip

    我们培训班刚发的面试题,2018年黑马最新程序员面试宝典+题库,内容包含大量java程序员初级知识点,以及框架的应用,js的基础。需要的赶紧下载准备面试吧. 2019年黑马最新版面试宝典题库 黑马 最新版面试 宝典题库

    python面试题-黑马:web+爬虫+Linux+数据库

    python面试题-黑马:web+爬虫+Linux+数据库

    2021Vue面试题笔记.pdf

    Vue面试题知识点总结 以下是根据提供的文件信息生成的知识点总结: 1. Vue 基础 * Vue 实例创建时,Vue 会遍历 data 中的属性,使用 Object.defineProperty(Vue 3.0 使用 proxy)将它们转换为 getter/setter,...

    黑马程序员__移动商城项目实战

    黑马程序员__移动商城项目实战 包括黑马程序员乐淘商城实战和慕课React+Antd

    黑马起爆_公式_黑马量能起爆_黑马起爆_起爆黑马_

    公式指标,黑马起爆,有助于判断什么时候可以入手

    2018年12月份黑马学员面试题

    【标题】2018年12月份黑马学员面试题 这份资料集合了2018年12月份期间,黑马程序员学员在求职过程中遇到的真实面试题目,涵盖了多个IT技术领域,包括但不限于Java、Python、前端开发、数据库、操作系统、网络、数据...

    2023黑马面试宝典-Java面试宝典大全-java面试宝典黑马

    Java面试宝典是Java程序员求职面试的重要参考资料,它涵盖了Java编程语言的核心概念、高级特性、设计模式、并发处理、框架应用、数据库交互等多个方面。以下将详细解析这些关键知识点: 1. **Java基础**:面试中,...

    2023java八股文高频面试题

    这份资源是一份2023年Java面试题集,适用于准备Java开发岗位面试的人员。本资源收集了大量的Java面试题,旨在帮助读者熟悉Java编程语言以及相关的编程技术和知识点,从而在面试中更好地展现自己的能力和潜力。本资源...

    黑马面试题附答案

    黑马面试题附答案

    黑马Android面试题整理

    以下是一些关于Android面试题的关键知识点,主要基于黑马程序员内部整理的资料: 1. **Activity**: - Activity是Android四大组件之一,它代表用户界面。通常,每个用户交互界面对应一个Activity。 - `...

Global site tag (gtag.js) - Google Analytics